c++操作xml文件

       做软件的不会c++,都不好意思说自己是搞软件的。最近也开始慢慢学习c++的东西,今天就写写c++如何操作xml文件吧。我们使用的是tinyxml,有个小巧的库,可以生成和解析XML文档。免费开源,可以直接将源码加到项目中,适合多种平台。他的官方文档为http://sourceforge.net/projects/tinyxml/,可以直接从上面下载相关资源。下载好之后添加到VC项目中,下面说说如何把它添加到项目中吧。

      第一步,找到我们的项目路径,右击项目,然后如图:

c++操作xml文件_第1张图片

点击“在文件资源管理器中打开文件夹”,然后就可以看到我们项目所在的路径了。

第二步,在项目路径下解压下载好的压缩包

c++操作xml文件_第2张图片

第三步,将其添加到项目中

c++操作xml文件_第3张图片

c++操作xml文件_第4张图片 

名字随机去,然后右键该文件

c++操作xml文件_第5张图片 

 点击现有项,找到刚才解压的路径,全选然后添加就好了

c++操作xml文件_第6张图片

添加之后,应该如图所示

c++操作xml文件_第7张图片 

添加到项目之后,就开始对xml进行操作,不多说,直接上代码

example.xml的代码如下:



    127.0.0.1
    
        andy
        20190608
    

 aaaa.xml的代码如下



    
        1
        2016-1-23 10:00
        吃饭
        Wang
    
    
        2
        2016-1-21 20:00
        看电影
        Jiang
    
    
        3
        2016-1-20 9:00
        去博物馆
        Li
    

c++的代码

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
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 nodes;
vector 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常见的使用方法已完成,请大家多多指教。 

 

你可能感兴趣的:(个人学习总结)