使用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 读写配置文件

1. 前言我们上次写了一段用来提取图片中交点信息的程序: http://blog.csdn.net/zhyh1435589631/article/details/53084795 但是, 我们发现代...
  • zhyh1435589631
  • zhyh1435589631
  • 2017年01月09日 22:29
  • 1038

C++使用TinyXml2解析Xml

1. TinyXml2 简介TinyXml 一直是一个非常好用的 Xml 解析工具 , 最新的开源版本 TinyXml2 相对于旧版本的 TinyXml 使用更少的内存 , 更快 , 并且使用更少的内...
  • tojohnonly
  • tojohnonly
  • 2017年03月26日 21:35
  • 688

在C++中使用TinyXML2解析xml

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

在C++中使用TinyXML2解析xml

tinyxm2变了很多,文档又少,坑爹 #include "template.h" #define cp(str) !strcmp(str, argv[i]) void make(Anim...
  • xiadasong007
  • xiadasong007
  • 2013年03月27日 09:57
  • 8214

C++,几个小巧开源xml库

我只是找个地方标记一下,省以后忘了   1、CMarkup 这个只能算是半开源的。网上能下载到的CMarkup源代码,绝大多数是CMarkup 付费版的阉割版本。当然,免费版已经能满足基本的读需...
  • holdsky
  • holdsky
  • 2013年08月17日 17:00
  • 2175

使用tinyxml2库解析xml

tinyxml2简介tinyxml2是c++编写的轻量级的xml解析器,而且是开放源代码的,在一些开源的游戏引擎中用的比较多。源码托管在github上。 源码地址:https://github.co...
  • Rongbo_J
  • Rongbo_J
  • 2015年04月25日 10:24
  • 4597

Magic C++ (函数指针)(xml配置控件样式)

C++ is so magic !!! 问题起源:       我在业余时间编写基于WTL的控件重绘,为了灵活设置控件的各种样式,我选择了使用xml来配置控件的样式(比如文字颜色,字体,背景颜色)...
  • zhoujielunzhimi
  • zhoujielunzhimi
  • 2013年04月23日 16:03
  • 991

推荐一个优秀的c++源代码,TinyXml2

项目主页:http://grinninglizard.com/tinyxml2docs/index.html     tinyxml2.h   /* Original code by Lee Thom...
  • wangyaninglm
  • wangyaninglm
  • 2015年05月26日 21:31
  • 3040

C++通过TinyXML类库读写XML文件

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树...
  • tennysonsky
  • tennysonsky
  • 2015年09月21日 18:28
  • 10745

C++ 工程实践(4):二进制兼容性http://blog.csdn.net/Solstice/article/details/6233478

C++ 工程实践(4):二进制兼容性 标签: c++libraryinterfacemfcclass编译器 2011-03-09 10:46 17338人阅读 评论(61) 收藏 举报 ...
  • wangyin159
  • wangyin159
  • 2016年02月10日 18:10
  • 556
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用C++ tinyxml2库
举报原因:
原因补充:

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