最近想找一个好用一点的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文档。它包含了文档的声明、注释、标签、元素、文本的添加。如果要继续构造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();就可以了。
大概就记录到这里了。