TinyXML指南
- 格式:doc
- 大小:127.50 KB
- 文档页数:27
tinyxml用法TinyXML是一个用于解析和生成XML文件的C++库。
它提供了一组简单且易于使用的API,可将XML文档解析为树状结构,让用户可以通过遍历这棵树来获取和修改XML文件中的内容。
本文将详细介绍TinyXML的使用方法,包括如何解析XML文件、访问节点、修改节点内容以及生成XML 文件等。
一、解析XML文件1.引入头文件和命名空间要使用TinyXML,首先需要引入头文件tinyxml.h:#include <tinyxml.h>然后在代码中使用命名空间:using namespace std;using namespace tinyxml2;2.打开并解析XML文件创建一个XML文档对象以及一个错误代码对象,然后调用LoadFile(方法打开并解析XML文件:XMLDocument doc;doc.LoadFile("example.xml");3.获取根节点使用RootElement(方法获取根节点:XMLElement* root = doc.RootElement(;4.遍历子节点可以使用FirstChildElement(方法获取第一个子节点,然后使用NextSiblingElement(方法依次获取下一个兄弟节点,直到遍历完所有子节点:for (XMLElement* child = root->FirstChildElement(; child != NULL; child = child->NextSiblingElement()//对子节点进行操作5.获取节点属性和内容使用Attribute(方法获取节点的属性值,使用GetText(方法获取节点的文本内容:const char* attributeValue = node->Attribute("属性名");const char* textContent = node->GetText(;二、访问和修改节点1.创建新节点可以使用NewElement(方法创建一个新节点,然后将其添加到指定节点的子节点列表中:XMLElement* newNode = doc.NewElement("节点名称");parentNode->InsertEndChild(newNode);2.修改节点属性和内容使用SetAttribute(方法设置节点的属性值,使用SetText(方法设置节点的文本内容:node->SetAttribute("属性名", "属性值");node->SetText("文本内容");3.删除节点使用DeleteChildren(方法删除节点的所有子节点:node->DeleteChildren(;4.复制节点可以使用CloneNode(方法复制一个节点:XMLElement* newNode = node->CloneNode(true);三、生成XML文件1.创建一个XML文档对象XMLDocument doc;2.创建根节点使用NewElement(方法创建一个根节点并将其添加到文档中:XMLElement* root = doc.NewElement("根节点名称");doc.InsertEndChild(root);3.创建子节点使用NewElement(方法创建一个子节点并将其添加到根节点的子节点列表中:XMLElement* child = doc.NewElement("子节点名称");root->InsertEndChild(child);4.创建属性使用SetAttribute(方法设置节点的属性值:child->SetAttribute("属性名", "属性值");5.创建文本内容使用SetText(方法设置节点的文本内容:child->SetText("文本内容");6.保存XML文件使用SaveFile(方法将XML文档保存为文件:doc.SaveFile("example.xml");以上就是TinyXML库的基本用法。
TinyXml使用指南(1) 作者:tamsyn 来源: 时间:2006-8-16 【字体:大中小】〖双击滚屏〗在这里我们并不是要讲解如何使用XML,或在网页中使用它。
而是要在C/C++中使用它。
详细一点就是在C/C++嵌套使用XML文件。
要在C/C++中使用XML文件,你就必须需要一个能分析XML文件的函数库。
在这方面有很多,比如libxml2,tinxml,expat等等很多。
而我使用的是tinyxml,为什么要使用它呢?因为它很小巧,只有两个头文件和四个CPP文件。
正如作者在tinyxml官方文件中所说的,如果你不是想在浏览器中使用XML,那么tinyxml非常适合你。
我们下面来看一下tinyxml是如何在C/C++中建立XML文件的。
char floader[200],buffer[200];TiXmlDocument* m_xmlDoc = new TiXmlDocument();TiXmlElement xElement("player");sprintf(buffer,"%d", 1);xElement.SetAttribute("admin", buffer);TiXmlElement xPos("pos");sprintf(buffer,"%d",2);xPos.SetAttribute("x", buffer);sprintf(buffer,"%d",3);xPos.SetAttribute("y", buffer);sprintf(buffer,"%d",4);xPos.SetAttribute("zone", buffer);xElement.InsertEndChild(xPos);m_xmlDoc->InsertEndChild(xElement);sprintf(floader,"%s.xml", "antking");m_xmlDoc->SaveFile(floader);delete m_xmlDoc;这段简单的代码的作用就是将用户数据保存在XML文件中。
TinyXML2使⽤教程(转)原⽂转⾃1.TinyXML2概述TinyXML2是simple、small、efficient开源的C++ XML⽂件解析库,可以很⽅便的应⽤到现有的项⽬之中。
⾮常适合存储简单数据,配置⽂件,对象序列化等数据量不是很⼤的操作。
TinyXML2详细介绍与源码获取⽅法详见:。
2. TinyXML1与TinyXML2对⽐TinyXML1与TinyXML2这两个著名的开源XML⽂件解析库均出⾃Lee Thomason之⼿,向这位满怀开源精神的⼤家致敬。
TinyXML2适⽤于⼤部分的C/C++项⽬开发,经得住考验,是最好的选择。
较TinyXML1⽽⾔,TinyXML2化繁为简,使⽤时只需要包含两个⽂件,⽽TinyXML1需要6个⽂件,⼀般⽣成静态链接库供项⽬的使⽤。
TinyXML1详细介绍与源码见:。
TinyXML1⽤法⽤例可以参考博⽂:。
TinyXML2使⽤了与TinyXML1相似都可API,并且拥有丰富的案例。
但TinyXML2解析器相对TinyXML1在代码上是完全重写,使其更适合于游戏开发中使⽤。
它使⽤更少的内存,更快,并使⽤更少的内存分配。
TinyXML2⽆需STL,也放弃了对STL⽀持。
所有字符串查询均使⽤C风格字符串“const char *”来表⽰,省去string类型对象的构造,并使代码更简单。
⼆者共同点:(1)都使⽤了简单易⽤的API。
(2)都是基于DOM(Document Object Model,⽂档对象模型)的解析器。
(3)都⽀持UTF-8编码。
TinyXML2的优点:(1)对⼤部分⼤部分的C/C++项⽬具有普适性。
(2)使⽤较少的内存(约TinyXML1的40%),速度变得更快。
(3)没有C++的STL的要求。
(4)更接近现代C++的特性,如使⽤了适当的命名空间。
(5)适当有效的处理了的空⽩字符(空格,TAB 和回车)。
TinyXML1的优点:(1)可以报告分析错误的位置。
原来的Windows 平台下的项目使用了MSXML组件来访问Web Service 接口,后来因为跨平台的需要,在Linux平台下改用了GSOAP+TinyXML(TinyXPath)来完成所需功能。
使用TinyXPath还是遇到了一些问题,总结一下。
这里要说明一下TinyXPath是TinyXML+XPath,下载TinyXPath包的时候会包含TinyXML的原文件。
1. 使用XPath,来获取XML子节点TinyXpath所支持的XPath并不完整,而且缺少文档资料,试了一整天才试出来,直接把结果写下来1.)节点名大小写无关匹配这里要用到name函数和translate函数,首先转化所有的节点名到大写,然后再比较。
语法如下:*[translate(name(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='XXXX']name函数返回节点名字,translate函数转换到大写。
2.)节点内容比较text函数返回节点内容,语法为*[text()='XXXX']3.)选择固定位置节点position函数用以指定第几个节点,语法为:*[position()=XXX] ,此处是数字类型举个例子,我们要选定节点名字为AAA,内容为BBB的第二个节点,XPath应改名为:*[translate(name(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='AAA' and text()='BBB' and position()=2]这里还有个查询效率问题,并不确定把 position()=2 条件放在最前面是不是可以提高效率。
以上内容可以封装成一个函数:inline string getNodeXPath(const string & strNodeName, string strText="", string pos=""){string strVal;strVal += "*[";strVal += "translate(name(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ') = '"+ strNode Name + "'";if(!strText.empty())strVal +=" and text()= '" +strText+"'";if(!pos.empty())strVal +=" and position()= " +pos;strVal += "]";return strVal;}#define NODE(node) getNode(node)#define NODE_AT(node,pos) getNode(node,"",pos)4.) 查询子节点满足一定条件的节点没有看到TinyXPath提供的直接可以获取子节点内容的函数,这里使用变通的方法,即先判断子节点条件然后使用parent关键词指定返回父节点,定义了HAS_CHILD宏#define HAS_CHILD(node,txt)string(string("/")+getNode(node,txt)+string("/parent::*"))举个例子:string strXPath;strXPath= "/" + NODE("XMLDATA") + "/" + NODE("RATES") ;strXPath+= "/" + NODE("REPORATEVO")+HAS_CHILD("TERMBYYEAR",mStrType)+HAS_CHILD("CONTRACTDATE",mStrSubTyp e);strXPath+= "/" + NODE("RATE");多个HAS_CHILD之间是并列关系。
什么是Tiny XML?TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux 中编译。
这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。
它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了,这里我把这四个cpp文件做成了静态库libtinyxml.a,使用的时候只在工程中需包含静态库和两个头文件。
继承关系:XML也是有这几个对象组成了,一般来说我们经常使用的类如下:● TiXmlDocument:文档类,它代表了整个xml文件。
● TiXmlDeclaration:声明类,它表示文件的声明部分,如上图所示。
● TiXmlComment:注释类,它表示文件的注释部分,如上图所示。
● TiXmlElement:元素类,它是文件的主要部分,并且支持嵌套结构,一般使用这种结构来分类的存储信息,它可以包含属性类和文本类,如上图所示。
如何析xml文档,一般是这样的:1 加载xml2 获得根元素3 获取任意一个元素4 对元素进行解析。
1加载xml加载xml首先必须得创建一个文档对象,文档类有下面几种构造函数TiXmlDocument();//Create a document with a name. The name of the document is also the filename of the xml.TiXmlDocument( const char * documentName );●通过文件载入有了文档对象后可以载入文件,载入文件的函数原型为bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );●通过字符串载入也可以通过载入xml字符串,函数原型为:virtual const char* Parse( const char* p, TiXmlParsingData* data = 0,TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );TiXmlParsingData* data 这个参数不知道有什么用,默认使用了没问题例如:TiXmlDocument doc();doc.Prase("<xml version=\"1.1\" ><a><n a=\"a\" /></a></xml>");●文档对象的四个成员函数void Print() const输出到控制台窗口bool SaveFile( const std::string& filename ) const;保存文档到指定文件名const char * ErrorDesc() const; //用来输出错误说明int ErrorId()const ; //用来输出错误ID2 获得根元素通过上一步加载的文档对象来获取跟元素,下面是获取根元素的函数原型:TiXmlElement* RootElement() ;doc.RootElement();//通过文档对象获取跟元素;3 获取任意一个元素通过上一步获取的根元素对象可以获取文档中的任意一个元素对象,主要通过以下函数:下面两个函数,返回第一个子元素。
这次使用了TinyXML后,觉得这个东西真是不错,于是将使用方法坐下总结来和大家分享。
该解析库在开源网站()上有下载,在本Blog也提供下载(下载TinyXML)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的一些操作。
tinyxml使用笔记与总结tinyxml使用笔记与总结tinyxml使用笔记与总结在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 version="1.0" standalone=no><!– Our to do list data –><ToDo><Item priority="1"> Go to the <bold>Toy store!</bold></Item><Item priority="2"> Do bills</Item></ToDo> 整个对象树:TiXmlDocument "demo.xml"TiXmlDeclaration "version=’1.0′" "standalone=no"TiXmlComment " Our to do list data"TiXmlElement "ToDo"TiXmlElement "Item" Attribtutes: priority = 1TiXmlText "Go to the "TiXmlElement "bold"TiXmlText "Toy store!"TiXmlElement "Item" Attributes: priority=2TiXmlText "Do bills"在tinyXML中,用FirstChild("名字")查找节点时,调用FirstChild函数的节点与要查找的节点必须成“父子关系”。
TinyXml使用指南一、 TinyXml的特点TinyXml是一个基于DOM模型的、非验证的轻量级C++解释器。
1. SAX和DOM目前XML的解析主要有两大模型:SAX和DOM。
其中SAX是基于事件的,其基本工作流程是分析XML文档,当发现了一个新的元素时,产生一个对应事件,并调用相应的用户处理函数。
这种方式占用内存少,速度快,但用户程序相应得会比较复杂。
而DOM(文档对象模型),则是在分析时,一次性的将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。
这种方式占用内存大,速度往往慢于SAX,但可以给用户提供一个面向对象的访问接口,对用户更为友好。
2. 验证和非验证对于一个特定的XML文档而言,其正确性分为两个层次。
首先是其格式应该符合XML的基本格式要求,比如第一行要有声明,标签的嵌套层次必须前后一致等等,符合这些要求的文件,就是一个合格的XML文件,称作well-formatted。
但除此之外,一个XML文档因其内容的不同还必须在语义上符合相应的标准,这些标准由相应的DTD 文件或者Schema文件来定义,符合了这些定义要求的XML文件,称作valid。
因此,解析器也分为两种,一种是验证的,即会跟据XML文件中的声明,用相应的DTD文件对XML文件进行校验,检查它是否满足DTD文件的要求。
另一种是忽略DTD文件,只要基本格式正确,就可以进行解析。
就我所知,验证的解析器通常都是比较重量级的。
TinyXml不支持验证,但是体积很小,用在解析格式较为简单的XML文件,比如配置文件时,特别的合适。
二、 TinyXml的构建和使用1. 获取TinyXml首页在/tinyxml/index.html,从这里可以找到最新版本的源代码,目前的版本是2.3.4。
2.构建TinyXml在构建时可以选择是否支持STL,选择的话,则可以使用std::string,所以通常应该打开这个选项。
TinyXML 指南这是什么?这份指南有一些关于如何有效地使用TinyXML的技巧和建议。
我也会尝试讲一些诸如怎样使字符串与整型数相互转化的C++技巧。
这与TinyXML本身没什么关系,但它也许会对你的项目有所帮助,所以我还是把它加进来了。
如果你不知道基本的C++概念,那么这份指南就没什么用了。
同样的,如果你不知道什么是DOM,那先从其它地方找来看看吧。
在我们开始之前一些将会被用到的XML数据集/文件。
example1.xml:<?xml version="1.0" ?><Hello>World</Hello>example2.xml:<?xml version="1.0" ?><poetry><verse>AlasGreat WorldAlas (again)</verse></poetry>example3.xml:<?xml version="1.0" ?><shapes><circle name="int-based" x="20" y="30" r="50" /><point name="float-based" x="3.5" y="52.1" /></shapes>example4.xml:<?xml version="1.0" ?><MyApp><!–Settings for MyApp –><Messages><Welcome>Welcome to MyApp</Welcome><Farewell>Thank you for using MyApp</Farewell></Messages><Windows><Window name="MainFrame" x="5" y="15" w="400" h="250" /></Windows><Connection ip="192.168.0.1" timeout="123.456000" /></MyApp>开始把文件加载成XML把一个文件加载成TinyXML DOM的最简单方法是:TiXmlDocument doc( "demo.xml" );doc.LoadFile();一个更接近于现实应用的例子如下。
TinyXML中文文档六月08TinyXML中文文档TinyXML No Comments »完整显示 1 2 3 4 5 6 7  译注:本文是TinyXML 2.5.2版本Document的中文文档,经原作者Lee Thomason同意由hansen翻译,如有误译或者错漏,欢迎指正。
版权:版权归原作者所有,翻译文档版权归本人hansen所有,转载请注明出处。
原文:/tinyxmldocs/index.html 0;TinyXml 文档2.5.2TinyXMLTinyXML是一个简单小巧,可以很容易集成到其它程序中的C++ XML解析器。
它能做些什么简单地说,TinyXML解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM)。
XML的意思是“可扩展标记语言“(eXtensible Markup Language)。
它允许你创建你自己的文档标记。
在为浏览器标记文档方面HTML做得很好,然而XML允许你定义任何文档标记,比如可以为一个组织者应用程序定义一个描述“to do”列表的文档。
XML拥有一个结构化并且方便的格式,所有为存储应用程序数据而创建的随机文件格式都可以用XML代替,而这一切只需要一个解析器。
最全面正确的说明可以在/TR/2004/REC-xml-20040204/找到,但坦白地说,它很晦涩难懂。
事实上我喜欢/xml/tutorial上关于XML的介绍。
有不同的方法可以访问和与XML数据进行交互。
TinyXML 使用文档对象模型(DOM),这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。
你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。
TinyXML被设计得容易快速上手。
TinyXML 指南注:本文是 TinyXML 2.5.3 版本 Document 中的《TinyXML Tutorial》的翻译文档,由本人Dennis.Gao 翻译,版权归原作者所有,转载本文档请注明出处。
原文出自 TinyXML 源码包doc 目录。
在线文档:/tinyxmldocs/tutorial0.htmlAuthor :Dennis.GaoDate : 2008.01.01这是什么?本指南就如何有效的使用 TinyXML 提供一些窍门和建议。
这里也会包括一些 C++ 的窍门,像如何在字符串和整数之间进行转换。
这和 TinyXML 本身并没有任何关系,但是它会对你的工程有所帮助,所以我把它写了进来。
如果你不知道 C++ 的基本概念,那么本指南对你没有任何用处。
同样,如果你不知道 DOM 是什么,先在别的地方学习一下吧。
开始之前一些 XML 数据集/文件将会被用到:example1.xml:example2.xml:example3.xml:example4.xml:开始起步从文件加载XML将一个文件加载到 TinyXML DOM 中的最简单方法:下面是一个更实际的用法。
它会加载文件并在标准输出中显示文件内容:这是在main() 函数中使用这个函数的简单示例:运行这个程序就可以将 XML 文件显示在控制台或 DOS 窗口中:在本指南的后面会给出 dump_to_stdout() 函数的定义,它对你了解如何递归遍历一个 DOM 十分有用。
通过编程建立XML 文档下面的函数可以建立 Example 1 文档:可以通过下面的调用来加载文件并将它显示在控制台上:你会发现它和 Example 1 是完全一样的:下面这段代码通过节点的建立和连接的不同顺序生成一个完全相同的 XML DOM :void write_simple_doc2(){// same as write_simple_doc1 but add each node// as early as possible into the tree.TiXmlDocument doc;TiXmlDeclaration * decl =new TiXmlDeclaration("1.0","", "");doc.LinkEndChild( decl );TiXmlElement * element =new TiXmlElement("Hello");doc.LinkEndChild( element );TiXmlText * text =new TiXmlText("World");element->LinkEndChild( text );doc.SaveFile("madeByHand2.xml");}也就是这种结构形式:属性很简单就可以给一个已经存在的节点设置属性:你也可以使用 TiXmlAttribute 对象来做这件事。
下面这段代码给出了一种(并非仅此一种)如何得到一个元素的所有属性,然后打印出名字和字符串值的方法,并且,如果这些值可以转换成整形或浮点型,那么把他们也打印出来:将文档写入文件将建立好的DOM 写入一个文件很简单:回想一下 example 4:下面的函数用来建立这个 DOM 并把它写进一份名为 "appsettings.xml" 的文件中:void write_app_settings_doc(){TiXmlDocument doc;TiXmlElement* msg;TiXmlDeclaration* decl =new TiXmlDeclaration("1.0","", "");doc.LinkEndChild( decl );TiXmlElement * root =new TiXmlElement("MyApp");doc.LinkEndChild( root );TiXmlComment * comment =new TiXmlComment();comment->SetValue(" Settings for MyApp ");root->LinkEndChild( comment );TiXmlElement * msgs =new TiXmlElement("Messages");root->LinkEndChild( msgs );msg =new TiXmlElement("Welcome");msg->LinkEndChild(new TiXmlText("Welcome to MyApp")); msgs->LinkEndChild( msg );msg =new TiXmlElement("Farewell");msg->LinkEndChild(new TiXmlText("Thank you for using MyApp"));msgs->LinkEndChild( msg );TiXmlElement * windows =new TiXmlElement("Windows"); root->LinkEndChild( windows );TiXmlElement * window;window =new TiXmlElement("Window");windows->LinkEndChild( window );window->SetAttribute("name","MainFrame");window->SetAttribute("x", 5);window->SetAttribute("y", 15);window->SetAttribute("w", 400);window->SetAttribute("h", 250);TiXmlElement * cxn =new TiXmlElement("Connection");root->LinkEndChild( cxn );cxn->SetAttribute("ip","192.168.0.1");cxn->SetDoubleAttribute("timeout", 123.456);// floating point attribdump_to_stdout(&doc );doc.SaveFile("appsettings.xml");}通过 dump_to_stdout() 函数可以显示这个结构:+ Comment: [ Settings for MyApp ]+ Element [Messages](No attributes)+ Element [Welcome](No attributes)+ Text: [Welcome to MyApp]+ Element [Farewell](No attributes)+ Text: [Thank you for using MyApp]+ Element [Windows](No attributes)+ Element [Window]+ name: value=[MainFrame]+ x: value=[5] int=5 d=5.0+ y: value=[15] int=15 d=15.0+ w: value=[400] int=400 d=400.0+ h: value=[250] int=250 d=250.05 attributes+ Element [Connection]+ ip: value=[192.168.0.1] int=192 d=192.2+ timeout: value=[123.456000] int=123 d=123.52 attributes很高兴在默认的情况下, TinyXml 用其他的 API 所谓的“优美”格式来写 XML ,它修改元素文字的空白,然后用嵌套层次的方式显示这棵树。
我没有注意到在写文件的时候是否有办法关掉缩排,但是这肯定很容易。
[ Lee:在 STL 模式下很容易,只要使用 cout << myDoc 就可以了。
非 STL 模式通常是“优美”格式的。
加入一个“开关”会是一个不错的特性,并且已经这么做了。
]XML 与C++ 对象之间的转换介绍这个示例假定你正要加载你的应用设置并把它们保存在 XML 文件中,就像 example4.xml 那样。
有许多办法可以完成这件事。
例如,看一看 TinyBind 这个工程,你可以在这里找到它:/projects/tinybind本节给出一个使用 XML 来加载并保存一个基本的对象结构的浅显易懂的方法。
建立你的对象类先从下面的这些基类入手:#include<string>#include<map>using namespace std;typedef std::map<std::string,std::string> MessageMap;// a basic window abstraction - demo purposes onlyclass WindowSettings{public:int x,y,w,h;string name;WindowSettings(): x(0), y(0), w(100), h(100), name("Untitled") {}WindowSettings(int x,int y,int w,int h,const string& name) {this->x=x;this->y=y;this->w=w;this->h=h;this->name=name;}};class ConnectionSettings{public:string ip;double timeout;};class AppSettings{public:string m_name;MessageMap m_messages;list<WindowSettings> m_windows; ConnectionSettings m_connection;AppSettings(){}void save(const char* pFilename);void load(const char* pFilename);// just to show how to do itvoid setDemoValues()这是一个简化的 main() 函数,它演示了如何建立一个默认设置的树的对象,保存它以及重新载入它:下面这个 main() 函数演示了如何建立,修改,保存,还有加载一个结构体:settings.m_messages["Welcome"]="Don't Panic";settings.m_messages["Farewell"]="Thanks for all the fish";settings.m_windows.push_back(WindowSettings(15,25,300 ,250,"BookFrame"));settings.m_connection.ip="192.168.0.77";settings.m_connection.timeout=42.0;settings.save("appsettings2.xml");}// block: load settings{AppSettings settings;settings.load("appsettings2.xml");printf("%s: %s\n", settings.m_name.c_str(),settings.m_messages["Welcome"].c_str());WindowSettings & w=settings.m_windows.front();printf("%s: Show window '%s' at %d,%d (%d x %d)\n", settings.m_name.c_str(), .c_str(), w.x, w.y, w.w, w.h);printf("%s: %s\n", settings.m_name.c_str(),settings.m_messages["Farewell"].c_str());}return 0;}编码为XML有许多不同的方法来解决如何将它(一个结构体)保存在文件中。