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的主要内容,如果未能解决你的问题,请参考以下文章

使用tinyxml-2更新XML DOM c ++上的数据

当我想在 C++ Builder Starter 中链接静态库 TinyXML 2 的发布版本时,为啥会出现未解决的外部错误?

xml_解析_解析方式和xml_常见的解析器

XML的XmlPullParser解析

XML解析

XML解析——Java中XML的四种解析方式