做软件的不会c++,都不好意思说自己是搞软件的。最近也开始慢慢学习c++的东西,今天就写写c++如何操作xml文件吧。我们使用的是tinyxml,有个小巧的库,可以生成和解析XML文档。免费开源,可以直接将源码加到项目中,适合多种平台。他的官方文档为http://sourceforge.net/projects/tinyxml/,可以直接从上面下载相关资源。下载好之后添加到VC项目中,下面说说如何把它添加到项目中吧。
第一步,找到我们的项目路径,右击项目,然后如图:
点击“在文件资源管理器中打开文件夹”,然后就可以看到我们项目所在的路径了。
第二步,在项目路径下解压下载好的压缩包
第三步,将其添加到项目中
名字随机去,然后右键该文件
点击现有项,找到刚才解压的路径,全选然后添加就好了
添加之后,应该如图所示
添加到项目之后,就开始对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常见的使用方法已完成,请大家多多指教。