关闭

使用C++ tinyxml2库

标签: Tinyxmlxml编程
288人阅读 评论(0) 收藏 举报


最近想找一个好用一点的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();就可以了。


大概就记录到这里了。


 


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1757次
    • 积分:56
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档