使用C++ tinyxml2库

原创 2015年07月08日 21:41:19


最近想找一个好用一点的xml解析、编辑库,于是就找到了tinyxml。在github上搜了一下,最新的是tinyxml2:

https://github.com/leethomason/tinyxml2

核心的文件只有两个:tinyxml2.h以及tinyxml2.cpp。把它当作工程的一部分就可以使用。

也可以将cpp文件编译为静态库,然后包含头文件,链接静态库。


这个库中比较关键的是这些类:

XMLDocument、XMLElement、XMLDeclaration、XMLComment

Document就是一个xml文档了。

Element就是xml中的一个个标签对,标签对之中还能嵌套许多elements,最大的一个Element就是xml文档的根节点,必须唯一。

Declaration就是每个xml文档开头必备的<? xxxxxx ?>。

Comments可以作为注释出现在任何地方,它被<-- 与 -->包围。


在tinyxlml中,一个document被以树的形式组织起来。为了创建一个xml文档,输入以下代码:

XMLDocument doc;

XMLDeclaration* dec = doc.NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\"");
doc.InsertFirstChild(dec);

doc.InsertEndChild(doc.NewComment(" one item behalfs one\
 contacted person. "));

XMLElement* root = doc.NewElement("svg");
    root->SetAttribute("width","100%");
    root->SetAttribute("height","100%");
    root->SetAttribute("version","1.1");
    root->SetAttribute("xmlns","http://www.w3.org/2000/svg");
    root->SetText("does text matter?");
    doc.InsertEndChild(root);

这样就在document节点下,挂上了declaration节点、comment和root节点。也就是:

doc +

        |-declaration

        |-comment

        |-svg

最后来一句

doc.SaveFile("b.xml",false);
可以将内存中的xml树结构写入文件。

这样,得到的xml文档如下(其实也是一个svg格式的空图片):

<?xml version="1.0" encoding="UTF-8"?>
<!-- one item behalfs one contacted person. -->
<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">does text matter?</svg> 

代码中演示的内容已经足以创建任何xml文档。它包含了文档的声明、注释、标签、元素、文本的添加。如果要继续构造svg的内容,如增加一个圆,那么可以这样:

 XMLElement* node;

node =  doc.NewElement("circle");
node->SetText("does text matter?");
node->SetAttribute("cx",100);
node->SetAttribute("cy",100);
node->SetAttribute("r",50);
node->SetAttribute("stroke","black");
node->SetAttribute("stroke-width",1);
node->SetAttribute("fill","red");
root->InsertFirstChild(node);


注意到任何新节点的创建都必须通过doc的NewElement方法。这意味着任何创建的节点都会与doc绑定,虽然把节点挂到doc上还需要额外的操作,但是创建的一刻已经决定这个节点是属于doc的。


以上是自己写xml的方法,下面介绍读取xml的办法。

读取xml文档可以通过文件( loadfile)或者内存buffer(parse)来读取。读取完毕之后得到的结构与我们自己建立的是一样的。

如何访问tinyxml内存中的树呢:

FirstChild()

FirstChildElement(char*)

Last** 

NextSibling()

NextSiblingElement(char*)

Previous**

Parent()

名字带Child的都是往下一层访问

名字带Sibling的都是往同层访问

名字带Parent的直接访问到父节点

名字带Element的需要指定一个名字作为过滤器。例如当前节点有一对的孩子,其中有些叫Tom,有些叫Jack。通过指定名字为Tom,我们就可以只访问那些叫Tom的孩子,而直接跳过Jack。


注意到名字不带Element的函数的返回类型是XMLNode。与XMLElement不一样,需要使用ToElement()来转化。简单的说就是调用FirstChild()->ToElement();就可以了。


大概就记录到这里了。


 


相关文章推荐

TinyXML2开源库使用

相关文章TinyXML2 学习: http://www.tuicool.com/articles/uYBB7j C++使用tinyxml创建和解析xml文件(本文用于cocos2dx):http://...

VS2010中使用TinyXML

1:什么是XML xml是可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 ...
  • jamy08
  • jamy08
  • 2014年05月28日 16:55
  • 1135

vs2012下tinyXml解析xml

TinyXML是一开源解析XML的库,其原理通过解析XML文件

C++使用tinyxml创建和解析xml文件(本文用于cocos2dx)

cocos2dx 2.2.5版里集成的tinyxml2不好用,总是baocu

在C++中使用TinyXML2解析xml

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。       TinyXML...

在C++中使用TinyXML2解析xml

需要在c++中解析设备描述文件。 所以选择了TinyXML2 读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和...

在C++中使用TinyXML2解析xml

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。       TinyXML...

C++中使用TinyXML2

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。       TinyXML...

C++使用TinyXml2解析Xml

1. TinyXml2 简介TinyXml 一直是一个非常好用的 Xml 解析工具 , 最新的开源版本 TinyXml2 相对于旧版本的 TinyXml 使用更少的内存 , 更快 , 并且使用更少的内...

使用tinyxml2库解析xml

tinyxml2简介tinyxml2是c++编写的轻量级的xml解析器,而且是开放源代码的,在一些开源的游戏引擎中用的比较多。源码托管在github上。 源码地址:https://github.co...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用C++ tinyxml2库
举报原因:
原因补充:

(最多只允许输入30个字)