Xml解析 --TinyXML-2
Posted 尚书左仆射
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xml解析 --TinyXML-2相关的知识,希望对你有一定的参考价值。
TinyXML-2 是小巧、精简且高效的C++ XML 解析库,可以被方便地应用到其他项目中。
github: https://github.com/leethomason/tinyxml2
简而言之,tinyxml-2是一个xml解析器,从xml文档构建一个可以读取、修改和保存的文档对象模型(dom)。
有多种方法可以访问XML数据并与之交互。TinyXML-2使用的是文档对象模型(DOM),这意味着XML数据被解析为可以浏览和操作的C++对象,然后写入磁盘或另一个输出流。还可以从头开始用C++对象构造XML文档,并将其写入磁盘或其他输出流。甚至可以使用tinyxml-2以编程方式从代码中流式处理xml,而无需先创建文档。
测试文件
<?xml version="1.0" encoding="UTF-8"?>
<root>
<User Name="name" Password ="psw">
<Gender>1</Gender>
<Mobile>13506681856</Mobile>
<Email>123@126.com</Email>
</User>
<zoo_cute>
<item id="2320" name="Rabbit" up_limit="100" down_limit="10" />
<item id="6323" name="Cheetah" up_limit="50" down_limit="5" />
<item id="6864" name="Lion" up_limit="20" down_limit="2" />
<item id="7211" name="Elephant" up_limit="5" down_limit="1" />
</zoo_cute>
</root>
使用方法
将tinyxml2.cpp和tinyxml2.h拷贝至项目目录,使用时包含
#include “tinyxml2.h”
using namespace tinyxml2;
测试代码
void test_xml()
const char* openPath = "settings/xml/test.xml";
const char* changePath = "settings/xml/change.xml";
XMLDocument doc;
if (doc.LoadFile( openPath ) != 0)
cout<<"load xml file failed!"<<endl;
return;
XMLElement* rootNode = doc.RootElement();
if(rootNode == NULL || rootNode == 0)
cout<<"rootNode is NULL!"<<endl;
return;
XMLElement* userNode = rootNode->FirstChildElement( "User" );
if(userNode == NULL || userNode == 0)
cout<<"userNode is NULL!"<<endl;
return;
const char* name = userNode->Attribute( "Name" );
const char* pass = userNode->Attribute( "Password" );
cout<<"Name:"<<name<<"|Password:"<<pass<<endl;
XMLElement* genderNode = userNode->FirstChildElement("Gender");
XMLElement* mobileNode = userNode->FirstChildElement("Mobile");
XMLElement* emailNode = userNode->FirstChildElement("Email");
//API:IntText(),UnsignedText(),Int64Text(),DoubleText(),BoolText() and FloatText() are suported
int gen = genderNode->IntText();
const char* mobile = mobileNode->GetText();
const char* email = emailNode->GetText();
cout<<"Gender:"<<gen<<"|Mobile:"<<mobile<<"|Email:"<<email<<endl;
XMLElement* zooNode = rootNode->FirstChildElement( "zoo_cute" );
if(zooNode == NULL || zooNode == 0)
cout<<"zooNode is NULL!"<<endl;
return;
for(XMLElement* item = zooNode->FirstChildElement("item"); item; item = item->NextSiblingElement("item"))
const char* id = item->Attribute( "id" );
const char* name = item->Attribute( "name" );
int down_limit = atoi(item->Attribute( "down_limit" ));
int up_limit = atoi(item->Attribute( "up_limit" ));
cout<<"id:"<<id<<"|name:"<<name<<"|down_limit:"<<down_limit<<"|up_limit:"<<up_limit<<endl;
item->SetAttribute("up_limit", 2 * up_limit );
doc.SaveFile(changePath);
代码中读取xml两种常见的配置方式下的各个属性值进行展示,后面修改了zoo_cute节点下item子节点的up_limit属性值,并将修改后的xml内容保存到另个一个文件中。
执行结果:
修改后保存的xml内容如下:
以上是关于Xml解析 --TinyXML-2的主要内容,如果未能解决你的问题,请参考以下文章
当我想在 C++ Builder Starter 中链接静态库 TinyXML 2 的发布版本时,为啥会出现未解决的外部错误?