本文转载自VS中使用TinyXml操作xml文件
XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的标记(markup)是关键部分。创建内容然后使用限定标记标记它,从而使每个单词、短语或块成为可识别、可分类的信息。创建的文件,或文档实例 由元素(标记)和内容构成。当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档。元素的描述性越强,文档各部分越容易识别。自从出现标记至今,带有标记的内容就有一个优势,即在计算机系统缺失时,仍然可以通过标记理解打印出来数据。标记语言从早期的私有公司和政府制定形式逐渐演变成标准通用标记语言(Standard Generalized Markup Language,SGML)、超文本标记语言(Hypertext Markup Language,HTML),并且最终演变成XML。SGML比较复杂,HTML(实际上仅是一组元素集)在识别信息方面不够强大。XML 则是一种易于使用和易于扩展的标记语言。可以使用 XML 创建自己的元素,从而能够更精确地表示自己的信息。可以在文档内部识别每个部分,而不是将文档看作仅由标题和段落组成。为了提高效率,可能需要定义数量一定的元素,并统一使用它们。一旦习惯使用XML之后,就可以在构建文件时尝试处理元素名称。
在http://sourceforge.net/projects/tinyxml/下载TinyXml的官方例子,里面有好几个文件,把tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlparser.cpp和tinyxmlerror.cpp这几个文件包含到工程内。包含头文件 #include "tinyxml.h",就可以开始使用tinyxml开始操作xml文件了。TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这课XML树。DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系(理解html语言的读者会很容易理解这种树状模型)。
如下是一个XML片段:
<Persons>
<Person ID="1">
<name>周星星</name>
<age>20</age>
</Person>
<Person ID="2">
<name>白晶晶</name>
<age>18</age>
</Person>
</Persons>
在TinyXML中,根据XML的各种元素来定义了一些类:
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释。
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分。
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
一、读取XML
TiXmlDocument *myDocument = new TiXmlDocument("C://myxml.xml"); myDocument->LoadFile(); TiXmlElement *RootElement = myDocument->RootElement(); cout << RootElement->Value() << endl; TiXmlElement *Person1 = RootElement->FirstChildElement(); TiXmlElement *Name1 = Person1->FirstChildElement(); TiXmlElement *Age1 = Name1->NextSiblingElement(); TiXmlAttribute *ID1 = Person1->FirstAttribute(); cout << Name1->FirstChild()->Value() << endl; cout << Age1->FirstChild()->Value() << endl; cout << ID1->Value() << endl; TiXmlElement *Person2 = Person1->NextSiblingElement(); TiXmlElement *Name2 = Person2->FirstChildElement(); TiXmlElement *Age2 = Name2->NextSiblingElement(); TiXmlAttribute *ID2 = Person2->FirstAttribute(); cout << Name2->FirstChild()->Value() << endl; cout << Age2->FirstChild()->Value() << endl; cout << ID2->Value() << endl;
二、生成XML
TiXmlDocument *myDocument = new TiXmlDocument(); TiXmlElement *RootElement = new TiXmlElement("Persons"); myDocument->LinkEndChild(RootElement); TiXmlElement *PersonElement1 = new TiXmlElement("Person"); RootElement->LinkEndChild(PersonElement1); PersonElement1->SetAttribute("ID","1"); TiXmlElement *NameElement1 = new TiXmlElement("name"); TiXmlElement *AgeElement1 = new TiXmlElement("age"); PersonElement1->LinkEndChild(NameElement1); PersonElement1->LinkEndChild(AgeElement1); TiXmlText *NameContent1 = new TiXmlText("周星星"); TiXmlText *AgeContent1 = new TiXmlText("20"); NameElement1->LinkEndChild(NameContent1); AgeElement1->LinkEndChild(AgeContent1); TiXmlElement *PersonElement2 = new TiXmlElement("Person"); RootElement->LinkEndChild(PersonElement2); PersonElement2->SetAttribute("ID","2"); TiXmlElement *NameElement2 = new TiXmlElement("name"); TiXmlElement *AgeElement2 = new TiXmlElement("age"); PersonElement2->LinkEndChild(NameElement2); PersonElement2->LinkEndChild(AgeElement2); TiXmlText *NameContent2 = new TiXmlText("白晶晶"); TiXmlText *AgeContent2 = new TiXmlText("18"); NameElement2->LinkEndChild(NameContent2); AgeElement2->LinkEndChild(AgeContent2); myDocument->SaveFile("C://myxml.xml");