c++操作xml文件

       做軟件的不會c++,都不好意思說自己是搞軟件的。最近也開始慢慢學習c++的東西,今天就寫寫c++如何操作xml文件吧。我們使用的是tinyxml,有個小巧的庫,可以生成和解析XML文檔。免費開源,可以直接將源碼加到項目中,適合多種平臺。他的官方文檔爲http://sourceforge.net/projects/tinyxml/,可以直接從上面下載相關資源。下載好之後添加到VC項目中,下面說說如何把它添加到項目中吧。

      第一步,找到我們的項目路徑,右擊項目,然後如圖:

點擊“在文件資源管理器中打開文件夾”,然後就可以看到我們項目所在的路徑了。

第二步,在項目路徑下解壓下載好的壓縮包

第三步,將其添加到項目中

 

名字隨機去,然後右鍵該文件

 

 點擊現有項,找到剛纔解壓的路徑,全選然後添加就好了

添加之後,應該如圖所示

 

添加到項目之後,就開始對xml進行操作,不多說,直接上代碼

example.xml的代碼如下:

<?xml version="1,0" encoding="GBK" ?>
<root>
    <host checked="true" station="1001">127.0.0.1</host>
    <client>
        <name>andy</name>
        <id>20190608</id>
    </client>
</root>

 aaaa.xml的代碼如下

<?xml version="1.0" encoding="GBK" ?>
<root>
    <node>
        <id>1</id>
        <when>2016-1-23 10:00</when>
        <where>吃飯</where>
        <who>Wang</who>
    </node>
    <node>
        <id>2</id>
        <when>2016-1-21 20:00</when>
        <where>看電影</where>
        <who>Jiang</who>
    </node>
    <node>
        <id>3</id>
        <when>2016-1-20 9:00</when>
        <where>去博物館</where>
        <who>Li</who>
    </node>
</root>

c++的代碼

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#include "../tinyxml/tinyxml.h"
void addChile( TiXmlElement * parent, const char* node, int value);
void addChile( TiXmlElement * parent, const char* node, const char* value);
struct Node
{
	int id;
	char when[32];
	char who[32];
	char where[32];
};
vector<Node> nodes;
vector<Node> Node_read;
//想容器添加東西
void addNode(int id, const char* when , const char* who , const char* where)
{
	Node n;
	n.id = id;
	strcpy(n.when, when);
	strcpy(n.who, who);
	strcpy(n.where, where);
	nodes.push_back(n);
}
//保存到xml文件中
int save()
{
	TiXmlDocument xml_doc;
	//添加聲明
	xml_doc.LinkEndChild(new TiXmlDeclaration("1.0" , "GBK" , ""));
	//添加根元素
	TiXmlElement* xml_root = new TiXmlElement("root");
	xml_doc.LinkEndChild(xml_root);
	//根元素下面添加節點
	for (unsigned int i = 0; i < nodes.size(); i++)
	{
		Node& n = nodes[i];
		//創建一個節點
		TiXmlElement* xml_node = new TiXmlElement("node");
		xml_root->LinkEndChild(xml_node);
		//創建第一個子節點
		if (1)
		{
			addChile(xml_node, "id" , n.id);
			addChile(xml_node, "when", n.when);
			addChile(xml_node, "where", n.where);
			addChile(xml_node, "who", n.who);
		}
	}
	//保存文件
	xml_doc.SaveFile("aaaa.xml");
	return 0;
}
//添加子節點
void addChile( TiXmlElement * parent , const char* node , int value)
{
	//創建節點
	TiXmlElement* xml_node = new TiXmlElement(node);
	//將int轉爲char
	char buf[32];
	sprintf(buf , "%d" , value);
	xml_node->LinkEndChild(new TiXmlText(buf));
	parent->LinkEndChild(xml_node);

}
void addChile( TiXmlElement * parent, const char* node, const char* value)
{
	//創建節點
	TiXmlElement* xml_node = new TiXmlElement(node);
	//將int轉爲char
	xml_node->LinkEndChild(new TiXmlText(value));
	parent->LinkEndChild(xml_node);
}
//生成xml文件
int test1()
{
	TiXmlDocument xml_doc;
	//添加XML聲明
	xml_doc.LinkEndChild(new TiXmlDeclaration("1,0", "GBK", ""));
	//添加根元素
	TiXmlElement* xml_root = new TiXmlElement("root");
	xml_doc.LinkEndChild(xml_root);
	//在根元素添加其他子元素
	if (1)
	{
		//添加host
		TiXmlElement* xml_child = new TiXmlElement("host");
		xml_root->LinkEndChild(xml_child);
		//添加文檔內容
		xml_child->LinkEndChild(new TiXmlText("127.0.0.1"));
		//設置屬性
		xml_child->SetAttribute("checked", "true");
		xml_child->SetAttribute("station", 1001);
	}
	//嵌套子元素
	if (1)
	{
		TiXmlElement* xml_client = new TiXmlElement("client");
		xml_root->LinkEndChild(xml_client);

		TiXmlElement* xml_clientName = new TiXmlElement("name");
		xml_clientName->LinkEndChild(new TiXmlText("andy"));
		xml_client->LinkEndChild(xml_clientName);

		TiXmlElement* xml_clientId = new TiXmlElement("id");
		xml_clientId->LinkEndChild(new TiXmlText("20190608"));
		xml_client->LinkEndChild(xml_clientId);

		//保存文件
		xml_doc.SaveFile("example.xml");
		//或者轉成string
		string text;
		text << xml_doc;
		return 0;
	}
}

//解析xml文件
int test2()
{
	//解析xml
	TiXmlDocument xml_doc;
	if (!xml_doc.LoadFile("example.xml"))
	{
		return -1;
	}
	//根節點
	TiXmlElement* xml_root = xml_doc.RootElement();
	if (xml_root == NULL)
	{
		return -1;
	}
	//獲取元素的文本與屬性
	if (1)
	{
		TiXmlElement* xml_host = xml_root->FirstChildElement("host");
		const char* text = xml_host->GetText();
		const char* aCheckedd = xml_host->Attribute("checked");
		const char* aStation = xml_host->Attribute("station");
		printf("text:%s , checked:%s , station:%s", text, aCheckedd, aStation);
	}
	if (1)
	{
		TiXmlElement* xml_client = xml_root->FirstChildElement("client");

		TiXmlElement* xml_name = xml_client->FirstChildElement("name");
		TiXmlElement* xml_id = xml_client->FirstChildElement("id");
	}
	return 0;
}
//解析多個子節點
int test3()
{
	//開始解析
	TiXmlDocument xml_doc;
	if (!xml_doc.LoadFile("aaaa.xml"))
	{
		return -1;
	}
	//獲取根元素
	TiXmlElement* xml_root = xml_doc.RootElement();
	if (xml_root == NULL)
	{
		return -1;
	}
	TiXmlElement* xml_note = xml_root->FirstChildElement("node");
	while (xml_note)
	{
		Node n;
		//獲取他們的值
		TiXmlElement* xml_id = xml_note->FirstChildElement("id");
		const char* id = xml_id->GetText();
		n.id = atoi(id);
		TiXmlElement* xml_when = xml_note->FirstChildElement("when");
		strcpy(n.when, xml_when->GetText());
		TiXmlElement* xml_where = xml_note->FirstChildElement("where");
		strcpy(n.where, xml_where->GetText());
		TiXmlElement* xml_who = xml_note->FirstChildElement("who");
		strcpy(n.who, xml_who->GetText());
		Node_read.push_back(n);
		//只想下一個兄弟節點
		xml_note = xml_note->NextSiblingElement();
	}

}
int main()
{
	//test1();
	//addNode(1, "2016-1-23 10:00", "Wang", "吃飯");
	//addNode(2, "2016-1-21 20:00", "Jiang", "看電影");
	//addNode(3, "2016-1-20 9:00", "Li", "去博物館");
	//save();
	test3();
	//遍歷vector
	for (int i = 0; i < Node_read.size(); i++)
	{
		Node n = Node_read[i];
		printf("id:%d \n, when:%s \n , where:%s \n, who:%s\n" , n.id , n.when , n.where , n.who);
	}
	printf("保存成功!\n");
	return 0;
}

至此,c++操作xml常見的使用方法已完成,請大家多多指教。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章