TinyXml 文档
2.5.2
TinyXML
TinyXML是一个简单小巧,可以很容易集成到其它程序中的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被设计得容易快速上手。它只有两个头文件和四个cpp文件。只需要把它们简单地加到你的项目中就行了。有一个例子文件——xmltest.cpp来引导你该怎么做。
TinyXMLZlib许可来发布,所以你可以在开源或者商业软件中使用它。许可证更具体的描述在每个源代码文件的顶部可以到。
TinyXML在保证正确和恰当的XML输出的基础上尝试成为一个灵活的解析器。TinyXML可以在任何合理的C++适用系统上编译。它不依赖于 异常或者运行时类型信息,有没有STL支持都可以编译。TinyXML完全支持UTF-8编码和前64k个字符实体(<i>译注:如果你不明 白这句译文,可能你需要了解一下Unicode编码</i>)。
它无法做些什么
TinyXML不解析不使用DTDs(文档类型定义)或者XSLs(可扩展样式表语言)。有其它解析器(到 搜索一下XML)具有更加全面的特性,但它们也就更大,需要花更长的时间来建立你的项目,有更陡的学习曲线,而且经常有一个更严格的许可协议。如果你是用 于浏览器或者有更复杂的XML需要,那么TinyXML不适合你。
下面的DTD语法在TinyXML里是不做解析的:
<!DOCTYPE Archiv [
<!ELEMENT Comment (#PCDATA)>
]>
因为TinyXML把它看成是一个带着非法嵌入!ELEMENT结点的!DOCTYPE结点。或许这在将来会得到支持。
指南
有耐性些,这是一份能很好地指导你怎么开始的指南,它(非常短小精悍)值得你花时间完整地读上一遍。
TinyXML指南
代码状况
TinyXML是成熟且经过测试的代码,非常健壮。如果你发现了漏洞,请提交漏洞报告到sourcefore网站上 www.sourceforge/projects/tinyxml)。 我们会尽快修正。
有些地方可以让你得到提高,如果你对TinyXML的工作感兴趣的话可以上sourceforge查一下。
相关项目
你也许会觉得TinyXML很有用!(简介由项目提供)
TinyXPath (tinyxpath.sourceforge). TinyXPath是一个小巧的XPath语法译码器脚本,用C++写成。
TinyXML++ (le/p/ticpp/). TinyXML++是一个全新的TinyXML接口,使用了许多诸如模板,异常处理和更好的错误处理这些C++强项技术。
特性
使用STL
TinyXML可以被编译成使用或不使用STL。如果使用STLTinyXML会使用std::string类,而且完全支持std:: istreamstd::ostreamoperator<<operator>>。许多API方法都有 ‘const char*’’const std::string&’两个版本。
如果被编译成不使用STL,则任何STL都不会被包含。所有string类都由TinyXML它自己实现。所有API方法都只提供’const char*’传入参数。
使用运行时定义:
TIXML_USE_STL
来编译成不同的版本。这可以作为参数传给编译器或者在tinyxml.h”文件的第一行进行设置。
注意:如果在Linux上编译测试代码,设置环境变量TINYXML_USE_STL=YES/NO可以控制STL的编译。而在Windows上, 项目文件提供了STL和非STL两种目标文件。在你的项目中,在tinyxml.h的第一行添加"#define TIXML_USE_STL"应该是最简单的。
UTF-8
TinyXML支持UTF-8,所以可以处理任何语言的XML文件,而且TinyXML也支持legacy模式——一种在支持UTF-8之前使用的编码方式,可能最好的解释是扩展的ascii”。
正常情况下,TinyXML会检测出正确的编码并使用它,然而,通过设置头文件中的TIXML_DEFAULT_ENCODING值,TinyXML可以被强制成总是使用某一种编码。
除非以下情况发生,否则TinyXML会默认使用Legacy模式:
1. 如果文件或者数据流以非标准但普遍的"UTF-8引导字节" (0xef 0xbb 0xbf)开始,TinyXML会以UTF-8的方式来读取它。
2. 如果包含有encoding="UTF-8"的声明被读取,那么TinyXML会以UTF-8的方式来读取它。
3. 如果读取到没有指定编码方式的声明,那么TinyXML会以UTF-8的方式来读取它。
4. 如果包含有encoding=“其它编码的声明被读取,那么TinyXML会以Legacy模式来读取它。在Legacy模式下,TinyXML会像以前那样工作,虽然已经不是很清楚这种模式是如何工作的了,但旧的内容还得保持能够运行。
5. 除了上面提到的情况,TinyXML会默认运行在Legacy模式下。
如果编码设置错误或者检测到错误会发生什么事呢?TinyXML会尝试跳过这些看似不正确的编码,你可能会得到一些奇怪的结果或者乱码,你可以强制TinyXML使用正确的编码模式。
通过使用LoadFile( TIXML_ENCODING_LEGACY )或者LoadFile( filename, TIXML_ENCODING_LEGACY ) 你可以强制TinyXML使用Legacy模式。你也可以通过设置TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY来强制一直使用Legacy模式。同样的,你也可以通过相同的方法来强制设置成 TIXML_ENCODING_UTF8
对于使用英文XML的英语用户来说,UTF-8low-ASCII是一样的。你不需要知道UTF-8或者一点也不需要修改你的代码。你可以把UTF-8当作是ASCII的超集。
UTF-8并不是一种双字节格式,但它是一种标准的Unicode编码!TinyXML当前不使用或者直接支持wcharTCHAR,或者微软的 _UNICODE"Unicode"这个术语被普遍地认为指的是UTF-16(一种unicode的宽字节编码)是不适当的,这是混淆的来源。
对于high-ascii”语言来说——几乎所有非英语语言,只要XML被编码成UTF-8 TinyXML就能够处理。说起来可能有点微妙,比较旧的程序和操作系统趋向于使用默认或者传统的编码方式。许多应用程序(和几乎所有现在的应用 程序)都能够输出UTF-8,但是那些比较旧或者难处理的(或者干脆不能使用的)系统还是只能以默认编码来输出文本。
比如说,日本的系统传统上使用SHIFT-JIS编码,这种情况下TinyXML就无法读取了。但是一个好的文本编辑器可以导入SHIFT-JIS的文本然后保存成UTF-8编码格式的。
link上关于转换编码的话题做得很好。
测试文件l”包含了英文、西班牙文、俄文和简体中文(希望它们都能够被正确
地转化)。utf8test.gif”文件是 IE上截取的XML文件快照。请注意如果你的系统上没有正确的字体(简体中文或者俄文),那么即使你正确地解析了也看不到与GIF文件上一样的输出。同 时要注意在一个西方编码的控制台上(至少我的Windows机器是这样),Print()或者printf()也无法正确地显示这个文件,这不关 TinyXML的事——这只是操作系统的问题。TinyXML没有丢掉或者损坏数据,只是控制台无法显示UTF-8而已。
实体
TinyXML认得预定义的特殊字符实体,即:
& &
< <
> >
" "
' ‘
这些在XML文档读取时都会被辨认出来,并会被转化成等价的UTF-8字符。比如下面的XML文本:
Far & Away
TiXmlText 对象查询出来时会变成"Far & Away"这样的值,而写回XML/文件时会以&”的方式写回。老版本的TinyXML“保留了字符实体,而在新版本中它们会被转化成字符串。
另外,所有字符都可以用它的Unicode编码数字来指定, " "" "都表示不可分的空格字符。
打印
TinyXML有几种不同的方式来打印输出,当然它们各有各的优缺点。
Print( FILE* ):输出到一个标准C流中,包括所有的C文件和标准输出。
o "相当漂亮的打印", 但你没法控制打印选项。
xml文件怎么打开o 输出数据直接写到FILE对象中,所以TinyXML代码没有内存负担。
o Print()SaveFile()调用。
operator<<:输出到一个c++流中。
o C++ iostreams集成在一起。
o "network printing"模式下输出没有换行符,这对于网络传输和C++对象之间的XML交换有好处,但人很难阅读。