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中,根据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 内容如下:
one
beijing
110
[email protected]
two
shanghai
120
[email protected]
- 像tixmldeclaration指的就是,
像tixmlcomment指的就是、 ,
像tixmldocument指的就是整个xml文档,
像tixmlelement指的就是、 、 、 等等这些节点,
像tixmltext指的就是‘one’、‘110’这些夹在与 、与 、与 之间的文本文字,
像tixmlattribute指的就是节点中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
#include
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
#include"tinyxml2.h"
using namespace std;
using namespace tinyxml2;
void example1()
{
static const char* testxml =
""
"world ";
xmldocument doc;
doc.parse(testxml); // 通过字符串导入xml
const char* content= doc.firstchildelement( "hello" )->gettext();
printf( "hello,%s", content );
}
int main()
{
example1();
return 0;
}
下面这个例子的场景更可能在工程中遇到,就是在xml中存储一些数据,然后由程序来调用。
0 10 10
0 0 -1
0 1 0
90
0 10 -10
10
0 10 -10
10
cpp 文件:
#include
#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<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 ) :获得下一个节点。