您的位置:首页 > 编程语言 > C语言/C++

使用C++ tinyxml2库

2015-07-08 21:41 465 查看
最近想找一个好用一点的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();就可以了。

大概就记录到这里了。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Tinyxml xml 编程