C++ 使用 TinyXml 解析 XML 文件

来源:互联网 发布:foursqure 数据集下载 编辑:程序博客网 时间:2024/05/16 14:47

知乎  C++解析xml有什么好用的轮子? :https://www.zhihu.com/question/32046606

TinyXML-2 的 github地址和帮助文档:https://github.com/leethomason/tinyxml2

tinyxml 下载地址:https://sourceforge.net/projects/tinyxml/


*Please Note* that TinyXML development has stopped and all development has moved to TinyXML-2.



前言


TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。



TinyXML介绍


在TinyXML中,根据XML的各种元素来定义了一些类:

TiXmlBase:       整个TinyXML模型的基类。TiXmlAttribute:  对应于XML中的元素的属性。TiXmlNode:       对应于DOM结构中的节点。TiXmlComment:    对应于XML中的注释。TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。TiXmlDocument:   对应于XML的整个文档。TiXmlElement:    对应于XML的元素。TiXmlText:       对应于XML的文字部分。TiXmlUnknown:    对应于XML的未知部分。 TiXmlHandler:    定义了针对XML的一些操作


引用来自tinyXML文档



TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<... ***=...>,其中***就是一个属性。


本地 F:\readXml.xml 内容如下: 

<?xml version="1.0" encoding="UTF-8"?><phonebook>       <!--one item behalfs one contacted person.-->      <people>        <name>one</name>        <addr>BeiJing</addr>        <tel>110</tel>        <email>110@gmail.com</email>    </people>    <people>        <name>two</name>        <addr>ShangHai</addr>        <tel>120</tel>        <email>120@gmail.com</email>    </people>    <!--more contacted persons.-->  </phonebook>
  • 像TiXmlDeclaration指的就是<?xml version="1.0" encoding="UTF-8"?>,
    像TiXmlComment指的就是<!--one item behalfs one contacted person.-->、 <!--more contacted persons.-->,
    像TiXmlDocument指的就是整个xml文档,
    像TiXmlElement指的就是<phonebook>、<people>、<name>、<addr>等等这些节点,
    像TiXmlText指的就是‘one’、‘110’这些夹在<people>与</people>、<name>与</name>、<addr>与</addr>之间的文本文字,
    像TiXmlAttribute指的就是<?xml version="1.0" encoding="UTF-8"?>节点中version、encoding,
    除此之外就是TiXmlUnknown。



下载


TinyXML 下载地址:http://sourceforge.net/projects/tinyxml/

这个下载的 TinyXML,TinyXML 现在已经停止开发,不再支持。现在开发已经转到 TinyXML-2上。

TinyXML使用https://www.cnblogs.com/ggjucheng/archive/2012/01/03/2311426.html


到 github 上下载 TinyXML2,解压可以看到所有文件。只需要里面的tinyxml2.h和tinyxml2.cpp。把这两个文件拷到工程目录里面。


其中,docs 里面是 帮助文档,可以直接浏览器打开 index.html 查看帮助。
下面是 Related Pages 标签内容。可以看到,即可以从 文件导入 xml ,也可以从字符串里面导入xml。



引用文件


建一个自己的工程,把 tinyxml2.h 和 tinyxml2.cpp 加到自己的工程里面


main.cpp (注意:一定要加上 using namespace tinyxml2; 这个命名空间

#include <iostream>#include <tinyxml2.h>using namespace std;using namespace tinyxml2;void readXml(){    char* filepath="F:\\readXml.xml";    XMLDocument doc;    doc.LoadFile(filepath);    doc.Print();}int main(int argc, char *argv[]){    readXml();    return 0;}

运行结果:



示例


通过字符串导入xml

#include <iostream>#include"tinyxml2.h"using namespace std;using namespace tinyxml2;void example1(){    static const char* testXML =        "<?xml version=\"1.0\"?>"        "<Hello>World</Hello>";    XMLDocument doc;    doc.Parse(testXML); // 通过字符串导入xml    const char* content= doc.FirstChildElement( "Hello" )->GetText();    printf( "Hello,%s", content );}int main(){    example1();    return 0;}


下面这个例子的场景更可能在工程中遇到,就是在XML中存储一些数据,然后由程序来调用。

<?xml version="1.0"?>  <scene name="Depth">      <node type="camera">          <eye>0 10 10</eye>          <front>0 0 -1</front>          <refUp>0 1 0</refUp>          <fov>90</fov>      </node>      <node type="Sphere">          <center>0 10 -10</center>          <radius>10</radius>      </node>      <node type="Plane">          <direction>0 10 -10</direction>          <distance>10</distance>      </node>  </scene>  

cpp 文件:

#include <iostream>  #include"tinyxml2.h"  using namespace std;  using namespace tinyxml2;  void example2()  {      XMLDocument doc;      doc.LoadFile("test.xml");      XMLElement *scene=doc.RootElement();      XMLElement *surface=scene->FirstChildElement("node");      while (surface)      {          XMLElement *surfaceChild=surface->FirstChildElement();          const char* content;          const XMLAttribute *attributeOfSurface = surface->FirstAttribute();          cout<< attributeOfSurface->Name() << ":" << attributeOfSurface->Value() << endl;          while(surfaceChild)          {              content=surfaceChild->GetText();              surfaceChild=surfaceChild->NextSiblingElement();              cout<<content<<endl;          }          surface=surface->NextSiblingElement();      }  }  int main()  {      example1();      return 0;  }  


解释一下几个函数:
        FirstChildElement(const char* value=0):获取第一个值为value的子节点,value默认值为空,则返回第一个子节点。
        RootElement():获取根节点,相当于FirstChildElement的空参数版本;
        const XMLAttribute* FirstAttribute() const:获取第一个属性值;
        XMLHandle NextSiblingElement( const char* _value=0 ) :获得下一个节点。


更多使用,可以查看帮助文档。。。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2岁宝宝害羞胆小怎么办 6个月的宝宝胆小怎么办 3岁半宝宝很胆小怎么办 分手了想他了怎么办 分手了还想联系怎么办 2岁多宝宝不长肉怎么办 2个月宝宝尿裤子怎么办 四岁宝宝脾气大怎么办 两周宝宝换奶粉怎么办 两周半宝宝不喝奶粉怎么办 2岁半宝宝太调皮怎么办 2岁宝宝晚上睡觉晚怎么办 三周岁半宝宝入园后不合群怎么办 数学懒于思考的孩子怎么办 2岁宝宝爱哭不讲道理怎么办 孩子不讲道理一直哭怎么办 白天不烧晚上烧怎么办 两岁宝宝出虚汗怎么办 两岁宝宝出水痘怎么办 两岁宝宝爱看手机怎么办 两岁宝宝太好动怎么办 五岁宝宝不会数数怎么办 四岁宝宝算数不好怎么办 两个月宝宝体内有火怎么办 两个月宝宝有火怎么办 2岁宝宝起眼屎怎么办 一周岁的宝宝皮肤过敏怎么办 两岁宝宝脾气倔不听话怎么办 22个月宝宝打人怎么办 两岁宝宝会打人怎么办 3岁哭闹倔强不止怎么办 我儿子二十三岁不爱说话怎么办 2岁宝宝不听话脾气大怎么办 2岁宝宝调皮不听话怎么办 2岁的宝宝不听话怎么办 2岁宝宝总是不听话怎么办 2岁宝宝淘气不听话怎么办 两岁宝宝不听大人的话怎么办? 来月经奶量减少怎么办 月经来了奶少怎么办 来例假奶水少了怎么办