﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-茶博-随笔分类-xml编译器</title><link>http://www.cppblog.com/yehongly/category/8290.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Oct 2008 12:12:45 GMT</lastBuildDate><pubDate>Tue, 14 Oct 2008 12:12:45 GMT</pubDate><ttl>60</ttl><item><title>TinyXML中文文档</title><link>http://www.cppblog.com/yehongly/archive/2008/10/14/63966.html</link><dc:creator>茶</dc:creator><author>茶</author><pubDate>Tue, 14 Oct 2008 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/yehongly/archive/2008/10/14/63966.html</guid><wfw:comment>http://www.cppblog.com/yehongly/comments/63966.html</wfw:comment><comments>http://www.cppblog.com/yehongly/archive/2008/10/14/63966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehongly/comments/commentRss/63966.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehongly/services/trackbacks/63966.html</trackback:ping><description><![CDATA[http://www.hansencode.cn/2007/06/tinyxml-chinese-doc.html<br><br>
<p>TinyXML是一个简单小巧，可以很容易集成到其它程序中的C++ XML解析器。 </p>
<p><strong>它能做些什么</strong></p>
<p>简单地说，TinyXML解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型（DOM）。 </p>
<p>XML的意思是&#8220;可扩展标记语言&#8220;（eXtensible Markup
Language）。它允许你创建你自己的文档标记。在为浏览器标记文档方面HTML做得很好，然而XML允许你定义任何文档标记，比如可以为一个组织者
应用程序定义一个描述&#8220;to do&#8221;列表的文档。
XML拥有一个结构化并且方便的格式，所有为存储应用程序数据而创建的随机文件格式都可以用XML代替，而这一切只需要一个解析器。 </p>
<p>最全面正确的说明可以在<a  href="http://www.w3.org/TR/2004/REC-xml-20040204/">http://www.w3.org/TR/2004/REC-xml-20040204/</a>找到，但坦白地说，它很晦涩难懂。事实上我喜欢<a  href="http://skew.org/xml/tutorial/">http://skew.org/xml/tutorial</a>上关于XML的介绍。 </p>
<p>有不同的方法可以访问和与XML数据进行交互。TinyXML使用文档对象模型（DOM），这意味着XML数据被解析成一个可被浏览和操作的C++
对象，然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。 </p>
<p>TinyXML被设计得容易快速上手。它只有两个头文件和四个cpp文件。只需要把它们简单地加到你的项目中就行了。有一个例子文件——xmltest.cpp来引导你该怎么做。 </p>
<p>TinyXML以Zlib许可来发布，所以你可以在开源或者商业软件中使用它。许可证更具体的描述在每个源代码文件的顶部可以找到。 </p>
<p>TinyXML在保证正确和恰当的XML输出的基础上尝试成为一个灵活的解析器。TinyXML可以在任何合理的C++适用系统上编译。它不依赖于
异常或者运行时类型信息，有没有STL支持都可以编译。TinyXML完全支持UTF-8编码和前64k个字符实体（&lt;i&gt;译注：如果你不明
白这句译文，可能你需要了解一下Unicode编码&lt;/i&gt;）。 </p>
<p><strong>它无法做些什么</strong></p>
<p>TinyXML不解析不使用DTDs（文档类型定义）或者XSLs（可扩展样式表语言）。有其它解析器（到www.sourceforge.org
搜索一下XML）具有更加全面的特性，但它们也就更大，需要花更长的时间来建立你的项目，有更陡的学习曲线，而且经常有一个更严格的许可协议。如果你是用
于浏览器或者有更复杂的XML需要，那么TinyXML不适合你。 </p>
<p>下面的DTD语法在TinyXML里是不做解析的： </p>
<p class="code"> &lt;!DOCTYPE Archiv [<br>
&lt;!ELEMENT Comment (#PCDATA)&gt;<br>
]&gt;</p>
<p>因为TinyXML把它看成是一个带着非法嵌入!ELEMENT结点的!DOCTYPE结点。或许这在将来会得到支持。 </p>
<p><strong>指南</strong></p>
<p>有耐性些，这是一份能很好地指导你怎么开始的指南，它（非常短小精悍）值得你花时间完整地读上一遍。 </p>
<ul>
    <li><a  href="http://www.hansencode.cn/2007/06/tinyxml-chinese-tutorial.html">TinyXML指南</a></li>
</ul>
<p><strong>代码状况</strong></p>
<p>TinyXML是成熟且经过测试的代码，非常健壮。如果你发现了漏洞，请提交漏洞报告到sourcefore网站上 （www.sourceforge.net/projects/tinyxml）。 我们会尽快修正。 </p>
<p>有些地方可以让你得到提高，如果你对TinyXML的工作感兴趣的话可以上sourceforge查找一下。 </p>
<p><strong>相关项目</strong></p>
<p>你也许会觉得TinyXML很有用！（简介由项目提供） </p>
<ul>
    <li>TinyXPath (<a  href="http://tinyxpath.sourceforge.net/">http://tinyxpath.sourceforge.net</a>). TinyXPath是一个小巧的XPath语法译码器脚本，用C++写成。</li>
    <li>TinyXML++ (<a  href="http://code.google.com/p/ticpp/">http://code.google.com/p/ticpp/</a>). TinyXML++是一个全新的TinyXML接口，使用了许多诸如模板，异常处理和更好的错误处理这些C++强项技术。</li>
</ul>
<p><strong>特性</strong></p>
<p><strong>使用STL </strong></p>
<p>TinyXML可以被编译成使用或不使用STL。如果使用STL，TinyXML会使用std::string类，而且完全支持
std::istream，std::ostream，operator&lt;&lt;和operator&gt;&gt;。许多API方法都有
&#8216;const char*&#8217;和&#8217;const std::string&amp;&#8217;两个版本。 </p>
<p>如果被编译成不使用STL，则任何STL都不会被包含。所有string类都由TinyXML它自己实现。所有API方法都只提供&#8217;const char*&#8217;传入参数。 </p>
<p>使用运行时定义： </p>
<p>TIXML_USE_STL </p>
<p>来编译成不同的版本。这可以作为参数传给编译器或者在&#8220;tinyxml.h&#8221;文件的第一行进行设置。 </p>
<p>注意：如果在Linux上编译测试代码，设置环境变量TINYXML_USE_STL=YES/NO可以控制STL的编译。而在Windows上，
项目文件提供了STL和非STL两种目标文件。在你的项目中，在tinyxml.h的第一行添加"#define
TIXML_USE_STL"应该是最简单的。 </p>
<p><strong>UTF-8 </strong></p>
<p>TinyXML支持UTF-8，所以可以处理任何语言的XML文件，而且TinyXML也支持&#8220;legacy模式&#8221;——一种在支持UTF-8之前使用的编码方式，可能最好的解释是&#8220;扩展的ascii&#8221;。 </p>
<p>正常情况下，TinyXML会检测出正确的编码并使用它，然而，通过设置头文件中的TIXML_DEFAULT_ENCODING值，TinyXML可以被强制成总是使用某一种编码。 </p>
<p>除非以下情况发生，否则TinyXML会默认使用Legacy模式： </p>
<ol>
    <li>如果文件或者数据流以非标准但普遍的"UTF-8引导字节" (0xef 0xbb 0xbf)开始，TinyXML会以UTF-8的方式来读取它。</li>
    <li>如果包含有encoding="UTF-8"的声明被读取，那么TinyXML会以UTF-8的方式来读取它。</li>
    <li>如果读取到没有指定编码方式的声明，那么TinyXML会以UTF-8的方式来读取它。</li>
    <li>如果包含有encoding=&#8220;其它编码&#8221;的声明被读取，那么TinyXML会以Legacy模式来读取它。在Legacy模式下，TinyXML会像以前那样工作，虽然已经不是很清楚这种模式是如何工作的了，但旧的内容还得保持能够运行。</li>
    <li>除了上面提到的情况，TinyXML会默认运行在Legacy模式下。</li>
</ol>
<p>如果编码设置错误或者检测到错误会发生什么事呢？TinyXML会尝试跳过这些看似不正确的编码，你可能会得到一些奇怪的结果或者乱码，你可以强制TinyXML使用正确的编码模式。 </p>
<p>通过使用LoadFile( TIXML_ENCODING_LEGACY )或者LoadFile( filename,
TIXML_ENCODING_LEGACY )，
你可以强制TinyXML使用Legacy模式。你也可以通过设置TIXML_DEFAULT_ENCODING =
TIXML_ENCODING_LEGACY来强制一直使用Legacy模式。同样的，你也可以通过相同的方法来强制设置成
TIXML_ENCODING_UTF8。 </p>
<p>对于使用英文XML的英语用户来说，UTF-8跟low-ASCII是一样的。你不需要知道UTF-8或者一点也不需要修改你的代码。你可以把UTF-8当作是ASCII的超集。 </p>
<p>UTF-8并不是一种双字节格式，但它是一种标准的Unicode编码！TinyXML当前不使用或者直接支持wchar，TCHAR，或者微软的
_UNICODE。"Unicode"这个术语被普遍地认为指的是UTF-16（一种unicode的宽字节编码）是不适当的，这是混淆的来源。 </p>
<p>对于&#8220;high-ascii&#8221;语言来说——几乎所有非英语语言，只要XML被编码成UTF-8，
TinyXML就能够处理。说起来可能有点微妙，比较旧的程序和操作系统趋向于使用&#8220;默认&#8221;或者&#8220;传统&#8221;的编码方式。许多应用程序（和几乎所有现在的应用
程序）都能够输出UTF-8，但是那些比较旧或者难处理的（或者干脆不能使用的）系统还是只能以默认编码来输出文本。 </p>
<p>比如说，日本的系统传统上使用SHIFT-JIS编码，这种情况下TinyXML就无法读取了。但是一个好的文本编辑器可以导入SHIFT-JIS的文本然后保存成UTF-8编码格式的。 </p>
<p><a  href="http://skew.org/xml/tutorial/">Skew.org link</a>上关于转换编码的话题做得很好。 </p>
<p>测试文件&#8220;utf8test.xml&#8221;包含了英文、西班牙文、俄文和简体中文（希望它们都能够被正确地转化）。&#8220;utf8test.gif&#8221;文件是
从IE上截取的XML文件快照。请注意如果你的系统上没有正确的字体（简体中文或者俄文），那么即使你正确地解析了也看不到与GIF文件上一样的输出。同
时要注意在一个西方编码的控制台上（至少我的Windows机器是这样），Print()或者printf()也无法正确地显示这个文件，这不关
TinyXML的事——这只是操作系统的问题。TinyXML没有丢掉或者损坏数据，只是控制台无法显示UTF-8而已。 </p>
<p><strong>实体</strong></p>
<p>TinyXML认得预定义的特殊&#8220;字符实体&#8221;，即： </p>
<p class="code"> &amp;amp; &amp;<br>
&amp;lt; &lt;<br>
&amp;gt; &gt;<br>
&amp;quot; "<br>
&amp;apos; &#8216;
</p>
<p>这些在XML文档读取时都会被辨认出来，并会被转化成等价的UTF-8字符。比如下面的XML文本： </p>
<p class="code"> Far &amp;amp; Away
</p>
<p>从TiXmlText 对象查询出来时会变成"Far &amp; Away"这样的值，而写回XML流/文件时会以&#8220;&amp;amp;&#8221;的方式写回。老版本的TinyXML&#8220;保留&#8221;了字符实体，而在新版本中它们会被转化成字符串。 </p>
<p>另外，所有字符都可以用它的Unicode编码数字来指定， "&#xA0;"和"&#160;"都表示不可分的空格字符。 </p>
<p><strong>打印</strong></p>
<p>TinyXML有几种不同的方式来打印输出，当然它们各有各的优缺点。 </p>
<ul>
    <li>Print( FILE* )：输出到一个标准C流中，包括所有的C文件和标准输出。</li>
    <ul>
        <li>"相当漂亮的打印", 但你没法控制打印选项。</li>
        <li>输出数据直接写到FILE对象中，所以TinyXML代码没有内存负担。</li>
        <li>被Print()和SaveFile()调用。</li>
    </ul>
    <li>operator&lt;&lt;：输出到一个c++流中。</li>
    <ul>
        <li>与C++ iostreams集成在一起。</li>
        <li>在"network printing"模式下输出没有换行符，这对于网络传输和C++对象之间的XML交换有好处，但人很难阅读。</li>
    </ul>
    <li>TiXmlPrinter：输出到一个std::string或者内存缓冲区中。</li>
    <ul>
        <li>API还不是很简练。</li>
        <li>将来会增加打印选项。</li>
        <li>在将来的版本中可能有些细微的变化，因为它会被改进和扩展。</li>
    </ul>
</ul>
<p><strong>流</strong></p>
<p>设置了TIXML_USE_STL，TinyXML就能支持C++流（operator &lt;&lt;，&gt;&gt;）和C（FILE*）流。但它们之间有些差异你需要知道： </p>
<p>C风格输出： </p>
<ul>
    <li>基于FILE*</li>
    <li>用Print()和SaveFile()方法</li>
</ul>
<p>生成具有很多空格的格式化过的输出，这是为了尽可能让人看得明白。它们非常快，而且能够容忍XML文档中的格式错误。例如一个XML文档包含两个根元素和两个声明仍然能被打印出来。 </p>
<p>C风格输入：</p>
<ul>
    <li>基于FILE*</li>
    <li>用Parse()和LoadFile()方法</li>
</ul>
<p>速度快，容错性好。当你不需要C++流时就可以使用它。 </p>
<p>C++风格输出： </p>
<ul>
    <li>基于std::ostream</li>
    <li>operator&lt;&lt;</li>
</ul>
<p>生成压缩过的输出，目的是为了便于网络传输而不是为了可读性。它可能有些慢（可能不会），这主要跟你系统上ostream类的实现有关。无法容忍格式错误的XML：此文档只能包含一个根元素。另外根级别的元素无法以流形式输出。 </p>
<p>C++风格输入： </p>
<ul>
    <li>基于std::istream</li>
    <li>operator&gt;&gt;</li>
</ul>
<p>从流中读取XML使其可用于网络传输。通过些小技巧，它知道当XML文档读取完毕时，流后面的就一定是其它数据了。TinyXML总假定当它读取到
根结点后XML数据就结束了。换句话说，那些具有不止一个根元素的文档是无法被正确读取的。另外还要注意由于STL的实现和TinyXML的限
制，operator&gt;&gt;会比Parse慢一些。 </p>
<p><strong>空格</strong></p>
<p>对是保留还是压缩空格这一问题人们还没达成共识。举个例子，假设&#8216;_&#8217;代表一个空格，对于"Hello____world"，HTML和某些XML
解析器会解释成"Hello_world"，它们压缩掉了一些空格。而有些XML解析器却不会这样，它们会保留空格，于是就是
&#8220;Hello____world&#8221;（记住_表示一个空格）。其它的还建议__Hello___world__应该变成Hello___world 。 </p>
<p>这是一个解决得不能让我满意的问题。TinyXML一开始就两种方式都支持。调用TiXmlBase::SetCondenseWhiteSpace( bool )来设置你想要的结果，默认是压缩掉多余的空格。 </p>
<p>如果想要改变默认行为，你应该在解析任何XML数据之前调用TiXmlBase::SetCondenseWhiteSpace( bool ) ，而且我不建议设置之后再去改动它。 </p>
<p><strong>句柄</strong></p>
<p>想要健壮地读取一个XML文档，检查方法调用后的返回值是否为null是很重要的。一种安全的检错实现可能会产生像这样的代码： </p>
<p class="code">TiXmlElement*&nbsp;root&nbsp;=&nbsp;document.FirstChildElement(&nbsp;<font color="#ff00ff">"Document"</font>&nbsp;);<br>
<font color="#0000ff">if</font>&nbsp;(&nbsp;root&nbsp;)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;TiXmlElement*&nbsp;element&nbsp;=&nbsp;root-&gt;FirstChildElement(&nbsp;<font color="#ff00ff">"Element"</font>&nbsp;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font>&nbsp;(&nbsp;element&nbsp;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TiXmlElement*&nbsp;child&nbsp;=&nbsp;element-&gt;FirstChildElement(&nbsp;<font color="#ff00ff">"Child"</font>&nbsp;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font>&nbsp;(&nbsp;child&nbsp;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TiXmlElement*&nbsp;child2&nbsp;=&nbsp;child-&gt;NextSiblingElement(&nbsp;<font color="#ff00ff">"Child"</font>&nbsp;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font>&nbsp;(&nbsp;child2&nbsp;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//&nbsp;Finally&nbsp;do&nbsp;something&nbsp;useful.</font>
</p>
<p>用句柄的话就不会这么冗长了，使用TiXmlHandle类，前面的代码就会变成这样： </p>
<p class="code">TiXmlHandle&nbsp;docHandle(&nbsp;&amp;document&nbsp;);<br>
TiXmlElement*&nbsp;child2&nbsp;=&nbsp;docHandle.FirstChild(&nbsp;<font color="#ff00ff">"Document"</font>&nbsp;).FirstChild(&nbsp;<font color="#ff00ff">"Element"</font>&nbsp;).Child(&nbsp;<font color="#ff00ff">"Child"</font>,&nbsp;1&nbsp;).ToElement();<br>
<font color="#0000ff">if</font>&nbsp;(&nbsp;child2&nbsp;)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//&nbsp;do&nbsp;something&nbsp;useful</font>
</p>
<p>这处理起来容易多了。 查阅TiXmlHandle可以得到更多的信息。 </p>
<p><strong>行列追踪</strong></p>
<p>对于某些应用程序来说，能够追踪节点和属性在它们源文件中的原始位置是很重要的。另外，知道解析错误在源文件中的发生位置可以节省大量时间。 </p>
<p>TinyXML能够追踪所有结点和属性在文本文件中的行列原始位置。TiXmlBase::Row() 和
TiXmlBase::Column()
方法返回结点在源文件中的原始位置。正确的制表符号可以经由TiXmlDocument::SetTabSize() 来配置。 </p>
<p><strong>使用与安装</strong></p>
<p>编译与运行xmltest： </p>
<p>提供了一个Linux Makefile和一个Windows Visual C++ .dsw 文件。只需要简单地编译和运行，它就会在你的磁盘上生成demotest.xml文件并在屏幕上输出。它还尝试用不同的方法遍历DOM并打印出结点数。 </p>
<p>那个Linux makefile很通用，可以运行在很多系统上——它目前已经在mingw和MacOSX上测试过。你不需要运行 &#8216;make depend&#8217;，因为那些依赖关系已经硬编码在文件里了。 </p>
<p><strong>用于VC6的Windows项目文件</strong></p>
<ul>
    <li>tinyxml： tinyxml 库，非STL</li>
    <li>tinyxmlSTL： tinyxml 库，STL</li>
    <li>tinyXmlTest： 用于测试的应用程序，非STL</li>
    <li>tinyXmlTestSTL： 用于测试的应用程序，STL</li>
</ul>
<p><strong>Makefile</strong></p>
<p>在makefile的顶部你可以设置： </p>
<p>PROFILE，DEBUG，和TINYXML_USE_STL。makefile里有具体描述。 </p>
<p>在tinyxml目录输入&#8220;make clean&#8221;然后&#8220;make&#8221;，就可以生成可执行的&#8220;xmltest&#8221;文件。 </p>
<p><strong>在某一应用程序中使用：</strong></p>
<p>把tinyxml.cpp，tinyxml.h， tinyxmlerror.cpp， tinyxmlparser.cpp，
tinystr.cpp， 和 tinystr.h
添加到你的项目和makefile中。就这么简单，它可以在任何合理的C++适用系统上编译。不需要为TinyXML打开异常或者运行时类型信息支持。
</p>
<p><strong>TinyXML怎么工作</strong></p>
<p>举个例子可能是最好的办法，理解一下： </p>
<p class="code"> &lt;?xml version="1.0" standalone=no&gt;<br>
&lt;!&#8211; Our to do list data &#8211;&gt;<br>
&lt;ToDo&gt;<br>
&lt;Item priority="1"&gt; Go to the &lt;bold&gt;Toy store!&lt;/bold&gt;&lt;/Item&gt;<br>
&lt;Item priority="2"&gt; Do bills&lt;/Item&gt;<br>
&lt;/ToDo&gt;
</p>
<p>它称不上是一个To Do列表，但它已经足够了。像下面这样读取并解析这个文件（叫&#8220;demo.xml&#8221;）你就能创建一个文档： </p>
<p>TiXmlDocument&nbsp;doc(&nbsp;<font color="#ff00ff">"demo.xml"</font>&nbsp;);<br>
doc.LoadFile();</p>
<p>现在它准备好了，让我们看看其中的某些行和它们怎么与DOM联系起来。 </p>
<p class="code">&lt;?xml version="1.0" standalone=no&gt;
</p>
<p>第一行是一个声明，它会转化成TiXmlDeclaration 类，同时也是文档结点的第一个子结点。 </p>
<p>这是TinyXML唯一能够解析的指令/特殊标签。一般来说指令标签会保存在TiXmlUnknown 以保证在它保存回磁盘时不会丢失这些命令。 </p>
<p class="code">&lt;!&#8211; Our to do list data &#8211;&gt;
</p>
<p>这是一个注释，会成为一个TiXmlComment对象。 </p>
<p class="code">&lt;ToDo&gt;
</p>
<p>"ToDo"标签定义了一个TiXmlElement 对象。它没有任何属性，但包含另外的两个元素。 </p>
<p class="code">&lt;Item priority="1"&gt;
</p>
<p>生成另一个TiXmlElement对象，它是&#8220;ToDo&#8221;元素的子结点。此元素有一个名为&#8220;priority&#8221;和值为&#8220;1&#8221;的属性。 </p>
<p class="code">Go to the
</p>
<p>TiXmlText ，这是一个叶子结点，它不能再包含其它结点，是"Item" TiXmlElement的子结点。 </p>
<p class="code">&lt;bold&gt;
</p>
<p>另一个TiXmlElement, 这也是&#8220;Item&#8221;元素的子结点。 </p>
<p>等等 </p>
<p>最后，看看整个对象树： </p>
<p class="code">TiXmlDocument "demo.xml"<br>
TiXmlDeclaration "version=&#8217;1.0&#8242;" "standalone=no"<br>
TiXmlComment " Our to do list data"<br>
TiXmlElement "ToDo"<br>
TiXmlElement "Item" Attribtutes: priority = 1<br>
TiXmlText "Go to the "<br>
TiXmlElement "bold"<br>
TiXmlText "Toy store!"<br>
TiXmlElement "Item" Attributes: priority=2<br>
TiXmlText "Do bills"
</p>
<p><strong>文档</strong></p>
<p>本文档由Doxygen使用&#8216;dox&#8217;配置文件生成。 </p>
<p><strong>许可证</strong></p>
<p>TinyXML基于zlib许可证来发布： </p>
<p>本软件按&#8220;现状&#8221;提供（即现在你看到的样子），不做任何明确或隐晦的保证。由使用此软件所引起的任何损失都决不可能由作者承担。 </p>
<p>只要遵循下面的限制，就允许任何人把这软件用于任何目的，包括商业软件，也允许修改它并自由地重新发布： </p>
<p>1. 决不能虚报软件的来源；你决不能声称是你是软件的第一作者。如果你在某个产品中使用了这个软件，那么在产品文档中加入一个致谢辞我们会很感激，但这并非必要。 </p>
<p>2. 修改了源版本就应该清楚地标记出来，决不能虚报说这是原始软件。 </p>
<p>3. 本通告不能从源发布版本中移除或做修改。 </p>
<p><strong>参考书目</strong></p>
<p>万维网联盟是定制XML的权威标准机构，它的网页上有大量的信息。 </p>
<p>权威指南：<a  href="http://www.w3.org/TR/2004/REC-xml-20040204/">http://www.w3.org/TR/2004/REC-xml-20040204/</a> </p>
<p>我还要推荐由OReilly出版由Robert Eckstein撰写的"XML Pocket Reference"&#8230;&#8230;这本书囊括了入门所需要的一切。 </p>
<p><strong>捐助者，联系人，还有简史</strong></p>
<p>非常感谢给我们建议，漏洞报告，意见和鼓励的所有人。它们很有用，并且使得这个项目变得有趣。特别感谢那些捐助者，是他们让这个网站页面生机勃勃。 </p>
<p>有很多人发来漏洞报告和意见，与其在这里一一列出来不如我们试着把它们写到&#8220;changes.txt&#8221;文件中加以赞扬。 </p>
<p>TinyXML的原作者是Lee Thomason(文档中还经常出现&#8220;我&#8221;这个词) 。在Yves Berquin，Andrew Ellerton，和tinyXml社区的帮助下，Lee查阅修改和发布新版本。 </p>
<p>我们会很感激你的建议，还有我们想知道你是否在使用TinyXML。希望你喜欢它并觉得它很有用。请邮寄问题，评论，漏洞报告给我们，或者你也可登录网站与我们取得联系： </p>
<p><a  href="http://www.sourceforge.net/projects/tinyxml/">www.sourceforge.net/projects/tinyxml</a> </p>
<p>Lee Thomason， Yves Berquin， Andrew Ellerton </p>
<br><br><img src ="http://www.cppblog.com/yehongly/aggbug/63966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehongly/" target="_blank">茶</a> 2008-10-14 16:52 <a href="http://www.cppblog.com/yehongly/archive/2008/10/14/63966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tinyxml使用入门手记</title><link>http://www.cppblog.com/yehongly/archive/2008/09/19/62249.html</link><dc:creator>茶</dc:creator><author>茶</author><pubDate>Fri, 19 Sep 2008 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/yehongly/archive/2008/09/19/62249.html</guid><wfw:comment>http://www.cppblog.com/yehongly/comments/62249.html</wfw:comment><comments>http://www.cppblog.com/yehongly/archive/2008/09/19/62249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehongly/comments/commentRss/62249.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehongly/services/trackbacks/62249.html</trackback:ping><description><![CDATA[<strong>http://www.dingge.com/forum/dispbbs.asp?boardID=43&amp;ID=14213&amp;page=1<br></strong>
<div id="textstyle_45350" style="min-height: 150px; font-size: 9pt; line-height: 22px; text-indent: 24px; margin-top: 20px;">
<p>最
近在准备给自己的GUI系统加入XML解析部分，就开始研究Tinyxml，差了不少资料，看了网友的例题还有Tinyxml本身自带的范例程序。得到了
很大的启发，得之余民而用之于民，我整理了一下简单的入门程序给大家，想必大家看完这两种调用方式就会用Tinyxml了。</p>
<p>就不说废话了，直接看程序：</p>
<p>两种不同的代码原因是对应不同的XML格式。我们先看第一种格式的XML文件（Tinyxml自带例题）</p>
<p><font color="#226ddd">------------------------------------------------------------------------------------------------------------------------<br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;document&gt;<br>&nbsp;&nbsp;&nbsp; &lt;English name="MY" value="UTF32"&gt;The world has many languages&lt;/English&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Button name="OK_btn" x = "20" y = "77"&gt;OK&lt;/Button&gt;<br>&lt;/document&gt;<br>-------------------------------------------------------------------------------------------------------------------------</font></p>
<div class="quote">
<p>#include "..\Tinyxml\tinyxml.h"<br>#include &lt;iostream&gt;<br>#include &lt;string&gt;<br>int main(void)<br>{<br>&nbsp;TiXmlDocument doc( "test2.xml");<br>&nbsp;doc.LoadFile();</p>
<p>&nbsp;TiXmlHandle docH( &amp;doc );<br>&nbsp;TiXmlElement* element = docH.FirstChildElement( "document" ).FirstChildElement( "Button" ).Element();<br>&nbsp;std::cout&lt;&lt;"&lt;"&lt;&lt;element-&gt;Value()&lt;&lt;"&gt;"&lt;&lt;std::endl;<br>&nbsp;std::cout&lt;&lt;"&nbsp;&nbsp; name = "&lt;&lt;element-&gt;Attribute( "name" )&lt;&lt;std::endl;<br>&nbsp;std::cout&lt;&lt;"&nbsp;&nbsp; x = "&lt;&lt;&nbsp;element-&gt;Attribute( "x" )&lt;&lt;std::endl;<br>&nbsp;std::cout&lt;&lt;"&nbsp;&nbsp; y = "&lt;&lt;&nbsp;element-&gt;Attribute( "y" )&lt;&lt;std::endl;<br>&nbsp;std::cout&lt;&lt;"&nbsp;&nbsp; Text = "&lt;&lt;element-&gt;GetText()&lt;&lt;std::endl;</p>
<p>&nbsp;getchar();<br>&nbsp;return 0;</p>
<p>}</p>
</div>
<p>&nbsp;这些代码我想已经很清楚了，所有的元素的值都会打印在屏幕上，如下：</p>
<p><strong>&lt;Button&gt;<br>&nbsp;&nbsp; name = OK_btn<br>&nbsp;&nbsp; x = 20<br>&nbsp;&nbsp; y = 77<br>&nbsp;&nbsp; Text = OK</strong><br></p>
<p>&nbsp;&nbsp;
这里的element 指针就是当前我们操作的指针，通过docH.FirstChildElement( "document"
).FirstChildElement( "Button"
).Element();方法我们获取了要寻找的Button这个元素的指针，然后它的元素就可以通过element-&gt;Attribute(
"name" )；element-&gt;Attribute( "x" )来得到了，使用非常方便。</p>
<p>Tinyxml中还有另外一种查找元素的方式，其对应的XML格式也是不同的，这种格式如下（以下直接借用了网友的例子）：</p>
<table style="border: 1px solid #999999; font-size: 12px; width: 80%;" align="center">
    <tbody>
        <tr>
            <td>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;persons&gt;<br>&lt;student&gt;<br>&nbsp;&nbsp; &lt;stu_name&gt;hami&lt;/stu_name&gt;<br>&nbsp;&nbsp; &lt;stu_age&gt;15&lt;/stu_age&gt;<br>&nbsp;&nbsp; &lt;stu_sex&gt;男&lt;/stu_sex&gt;<br>&lt;/student&gt;<br>&lt;teacher&gt;<br>&nbsp;&nbsp; &lt;tea_name&gt;alin&lt;/tea_name&gt;<br>&nbsp;&nbsp; &lt;tea_age&gt;16&lt;/tea_age&gt;<br>&nbsp;&nbsp; &lt;tea_sex&gt;女&lt;/tea_sex&gt;<br>&lt;/teacher&gt;<br>&lt;/persons&gt;</td>
        </tr>
    </tbody>
</table>
<p>readXmlElement.cpp</p>
<table style="border: 1px solid #999999; font-size: 12px; width: 80%;" align="center">
    <tbody>
        <tr>
            <td>
            <div>#pragma comment(lib,"tinyxml.lib")</div>
            <div>#include "tinyxml.h"<br>#include &lt;iostream&gt;<br>#include &lt;string&gt;</div>
            <div>#define TIXML_USE_STL</div>
            <div>int main(void)<br>{<br>TiXmlDocument *personDoc = new TiXmlDocument;<br>personDoc-&gt;LoadFile("test.xml");</div>
            <div>TiXmlElement *personElement = personDoc-&gt;RootElement();<br>std::cout&lt;&lt;personElement-&gt;Value()&lt;&lt;std::endl;</div>
            <div>TiXmlElement *student = personElement-&gt;FirstChildElement();<br>std::cout&lt;&lt;" "&lt;&lt;student-&gt;Value()&lt;&lt;std::endl;</div>
            <div>TiXmlElement *nameElement = student-&gt;FirstChildElement();<br>std::cout&lt;&lt;"&nbsp;&nbsp;&nbsp; "&lt;&lt;nameElement-&gt;Value();//&lt;&lt;std::endl;<br>//std::cout&lt;&lt;"&nbsp;&nbsp;&nbsp; "&lt;&lt;nameElement-&gt;GetText()&lt;&lt;std::endl;</div>
            <div>TiXmlElement *ageElement = nameElement-&gt;NextSiblingElement();<br>std::cout&lt;&lt;"&nbsp;&nbsp;&nbsp; "&lt;&lt;ageElement-&gt;Value()&lt;&lt;std::endl;</div>
            <div>TiXmlElement *sexElement = ageElement-&gt;NextSiblingElement();<br>std::cout&lt;&lt;"&nbsp;&nbsp;&nbsp; "&lt;&lt;sexElement-&gt;Value()&lt;&lt;std::endl;</div>
            <div>TiXmlElement *teacher = student-&gt;NextSiblingElement();<br>std::cout&lt;&lt;" "&lt;&lt;teacher-&gt;Value()&lt;&lt;std::endl;</div>
            <div>TiXmlElement *teaNameElement = teacher-&gt;FirstChildElement();<br>std::cout&lt;&lt;"&nbsp;&nbsp;&nbsp; "&lt;&lt;teaNameElement-&gt;Value()&lt;&lt;std::endl;</div>
            <div>TiXmlElement *teaAgeElement = teaNameElement-&gt;NextSiblingElement();<br>std::cout&lt;&lt;"&nbsp;&nbsp;&nbsp; "&lt;&lt;teaAgeElement-&gt;Value()&lt;&lt;std::endl;</div>
            <div>TiXmlElement *teaSexElement = teaAgeElement-&gt;NextSiblingElement();<br>std::cout&lt;&lt;"&nbsp;&nbsp;&nbsp; "&lt;&lt;teaSexElement-&gt;Value()&lt;&lt;std::endl;</div>
            <div>return 0;<br>}</div>
            </td>
        </tr>
    </tbody>
</table>
<p>如果看懂了第一个例子，这个例子就非常好懂了。不用说什么，输出以后答案都在屏幕上。</p>
<p>在真正的tinyxml使用过程中，往往是这两种方式的组合使用，大多数游戏中的XML都比较复杂，元素的层次也很多，所以大家通过简单的了解以后，更多的还要靠自己去练习，在实践中提高。如果有什么疑问或者讨论的，可以在这里留言，希望大家多多交流！</p>
</div>
<br><img src ="http://www.cppblog.com/yehongly/aggbug/62249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehongly/" target="_blank">茶</a> 2008-09-19 10:36 <a href="http://www.cppblog.com/yehongly/archive/2008/09/19/62249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实战TinyXML</title><link>http://www.cppblog.com/yehongly/archive/2008/09/16/61932.html</link><dc:creator>茶</dc:creator><author>茶</author><pubDate>Tue, 16 Sep 2008 01:02:00 GMT</pubDate><guid>http://www.cppblog.com/yehongly/archive/2008/09/16/61932.html</guid><wfw:comment>http://www.cppblog.com/yehongly/comments/61932.html</wfw:comment><comments>http://www.cppblog.com/yehongly/archive/2008/09/16/61932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehongly/comments/commentRss/61932.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehongly/services/trackbacks/61932.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://blog.csdn.net/KyosukeNo1/archive/2006/07/04/875481.aspx这几天在埋头写自己的3D文件浏览器（稍后发布），突发奇想的要把自己的内部格式转化成XML，于是，把以前在研究所时用过的ExPat翻了出来。 ExPat是基于事件的XML解释器，速度挺快的，但结构方面有点不敢恭维－－当年写配置文件的导出导入部分花了我足足1个星期！而且由于它...&nbsp;&nbsp;<a href='http://www.cppblog.com/yehongly/archive/2008/09/16/61932.html'>阅读全文</a><img src ="http://www.cppblog.com/yehongly/aggbug/61932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehongly/" target="_blank">茶</a> 2008-09-16 09:02 <a href="http://www.cppblog.com/yehongly/archive/2008/09/16/61932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> C++解析XML(From:C++ front)</title><link>http://www.cppblog.com/yehongly/archive/2008/09/12/61678.html</link><dc:creator>茶</dc:creator><author>茶</author><pubDate>Fri, 12 Sep 2008 06:12:00 GMT</pubDate><guid>http://www.cppblog.com/yehongly/archive/2008/09/12/61678.html</guid><wfw:comment>http://www.cppblog.com/yehongly/comments/61678.html</wfw:comment><comments>http://www.cppblog.com/yehongly/archive/2008/09/12/61678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yehongly/comments/commentRss/61678.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yehongly/services/trackbacks/61678.html</trackback:ping><description><![CDATA[http://blog.csdn.net/wangqis/archive/2006/05/17/743039.aspx<br>http://blog.csdn.net/amidiot/archive/2005/09/11/477335.aspx<br><br>
<p>用mingw32-make前修改一下makefile文件,改为如下<br><br># DEBUG can be set to YES to include debugging info, or NO otherwise(不是DEBUG)<br>DEBUG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := NO </p>
<p># PROFILE can be set to YES to include profiling info, or NO otherwise<br>PROFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; := NO</p>
<p># TINYXML_USE_STL can be used to turn on STL support. NO, then STL<br># will not be used. YES will include the STL files.(使用STL,选择的话，则可以使用std::string)<br>TINYXML_USE_STL := YES</p>
<br>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">张弛</span><span lang="EN-US">&lt;<a  href="http://amidiot.512j.com/article/tinyxml/tinyxml_note.htm" target="_blank"><img  src="http://amidiot.512j.com/article/tinyxml/tinyxml_note.files/image002.gif" alt="zhangchi(at)china.com" align="middle"></a>&gt;<br></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US"><span style="font-weight: bold;">注:本文的最新版本可以在下面的地址找到<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <a  href="http://amidiot.512j.com/article/tinyxml/tinyxml_note.htm" target="_blank">http://amidiot.512j.com/article/tinyxml/tinyxml_note.htm</a></span></span></p>
<h2 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>一、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US"><a  href="http://www.grinninglizard.com/tinyxml/index.html" title="">TinyXml</a></span><span style="font-family: 黑体;">的特点</span></h2>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US"><a  href="http://www.grinninglizard.com/tinyxml/index.html" title="">TinyXml</a></span><span style="font-family: 宋体;">是一个基于</span><span lang="EN-US">DOM</span><span style="font-family: 宋体;">模型的、非验证的轻量级</span><span lang="EN-US">C++</span><span style="font-family: 宋体;">解释器。</span></p>
<h3 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">SAX</span><span style="font-family: 宋体;">和</span><span lang="EN-US">DOM</span></h3>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">目前</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">的解析主要有两大模型：</span><span lang="EN-US">SAX</span><span style="font-family: 宋体;">和</span><span lang="EN-US">DOM</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">其中</span><span lang="EN-US">SAX</span><span style="font-family: 宋体;">是基于事件的，其基本工作流程是分析</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文档，当发现了一个新的元素时，产生一个对应事件，并调用相应的用户处理函数。这种方式占用内存少，速度快，但用户程序相应得会比较复杂。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">而</span><span lang="EN-US">DOM</span><span style="font-family: 宋体;">（文档对象模型），则是在分析时，一次性的将整个</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文档进行分析，并在内存中形成对应的树结构，同时，向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大，速度往往慢于</span><span lang="EN-US">SAX</span><span style="font-family: 宋体;">，但可以给用户提供一个面向对象的访问接口，对用户更为友好。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">另据说，一些同时提供了</span><span lang="EN-US">SAX</span><span style="font-family: 宋体;">和</span><span lang="EN-US">DOM</span><span style="font-family: 宋体;">接口的库，是在底层先实现</span><span lang="EN-US">SAX</span><span style="font-family: 宋体;">，再在</span><span lang="EN-US">SAX</span><span style="font-family: 宋体;">的基础上实现</span><span lang="EN-US">DOM</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">目前我知道的</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">解析库有下面几个：</span></p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="border: 1pt solid windowtext; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">名称</span></p>
            </td>
            <td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">访问接口</span></p>
            </td>
            <td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">是否支持验证</span></p>
            </td>
            <td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">备注</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">Expat</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">SAX/Local</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">不清楚</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">Local</span><span style="font-family: 宋体;">指它还有一套自己访问模型</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">LibXML2</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">SAX/DOM</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">是</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">
            <p>&nbsp;</p>
            </span></p>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">TinyXml</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">DOM</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">否</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">
            <p>&nbsp;</p>
            </span></p>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">XML<chmetcnv style="background-position: left bottom; background-image: url(res://ietag.dll/#34/#1001); background-repeat: repeat-x;" tabindex="0" unitname="C" sourcevalue="4" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on"></chmetcnv>4C</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">SAX/DOM</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">是</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">和</span><span lang="EN-US">Xerces-C</span><span style="font-family: 宋体;">是一家，不过用了</span><span lang="EN-US">ICU</span><span style="font-family: 宋体;">，国际化似乎更好</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">Xerces-C</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">SAX/DOM</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">是</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">
            <p>&nbsp;</p>
            </span></p>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">XML Booster</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span lang="EN-US">Local</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">不清楚</span></p>
            </td>
            <td style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt;" valign="top">
            <p class="MsoNormal"><span style="font-family: 宋体;">这个库不是特别了解，好像是类似</span><span lang="EN-US">yacc</span><span style="font-family: 宋体;">那样，可以生成一个特定的解析器，估计效率应该很高（看名字也像）。</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal"><span lang="EN-US">
<p>&nbsp;</p>
</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">验证和非验证</span></h3>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">对于一个特定的</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文档而言，其正确性分为两个层次。首先是其格式应该符合</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">的基本格式要求，比如第一行要有声明，标签的嵌套层次必须前后一致等等，符合这些要求的文件，就是一个合格的</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文件，称作</span><span lang="EN-US">well-formatted</span><span style="font-family: 宋体;">。但除此之外，一个</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文档因其内容的不同还必须在语义上符合相应的标准，这些标准由相应的</span><span lang="EN-US">DTD</span><span style="font-family: 宋体;">文件或者</span><span lang="EN-US">Schema</span><span style="font-family: 宋体;">文件来定义，符合了这些定义要求的</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文件，称作</span><span lang="EN-US">valid</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">因此，解析器也分为两种，一种是验证的，即会跟据</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文件中的声明，用相应的</span><span lang="EN-US">DTD</span><span style="font-family: 宋体;">文件对</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文件进行校验，检查它是否满足</span><span lang="EN-US">DTD</span><span style="font-family: 宋体;">文件的要求。另一种是忽略</span><span lang="EN-US">DTD</span><span style="font-family: 宋体;">文件，只要基本格式正确，就可以进行解析。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">就我所知，验证的解析器通常都是比较重量级的。</span><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">不支持验证，但是体积很小，用在解析格式较为简单的</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文件，比如配置文件时，特别的合适。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">
<p>&nbsp; <br></p>
</span></p>
<h2 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>二、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">TinyXml</span><span style="font-family: 黑体;">的构建和使用</span></h2>
<h3 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">获取</span></h3>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">首页在</span><span lang="EN-US"><a  href="http://www.grinninglizard.com/tinyxml/index.html">http://www.grinninglizard.com/tinyxml/index.html</a></span><span style="font-family: 宋体;">，从这里可以找到最新版本的源代码，目前的版本是</span><chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"></chsdate><span lang="EN-US">2.3.4</span><span style="font-family: 宋体;">。</span></p>
<h3 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">构建</span></h3>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">在构建时可以选择是否支持</span><span lang="EN-US">STL</span><span style="font-family: 宋体;">，选择的话，则可以使用</span><span class="SpellE"><span lang="EN-US">std::string</span></span><span style="font-family: 宋体;">，所以通常应该打开这个选项。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">在</span><span lang="EN-US">Windows</span><span style="font-family: 宋体;">上，</span><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">的源码包里提供了</span><span lang="EN-US">VC6</span><span style="font-family: 宋体;">的工程文件，直接用它就可以生成两个静态库（带</span><span lang="EN-US">STL</span><span style="font-family: 宋体;">和不带</span><span lang="EN-US">STL</span><span style="font-family: 宋体;">），非常容易。唯一需要注意的是，默认生成的库是单线程的，如果用在多线程的项目中，需要改动一下配置，生成相应的多线程库。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">在</span><span lang="EN-US">Unix</span><span style="font-family: 宋体;">平台上，</span><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">的源码包里只提供了一个</span><span class="SpellE"><span lang="EN-US">Makefile</span></span><span style="font-family: 宋体;">，对于典型的</span><span lang="EN-US">Linux</span><span style="font-family: 宋体;">系统，或装了</span><span class="SpellE"><span lang="EN-US">gcc</span></span><span style="font-family: 宋体;">和</span><span class="SpellE"><span lang="EN-US">gmake</span></span><span style="font-family: 宋体;">的其他</span><span lang="EN-US">Unix</span><span style="font-family: 宋体;">，这个</span><span class="SpellE"><span lang="EN-US">Makefile</span></span><span style="font-family: 宋体;">足够用了，我在</span><span lang="EN-US">RH9</span><span style="font-family: 宋体;">和</span><span lang="EN-US">RHEL4</span><span style="font-family: 宋体;">上测试，简单的</span><span lang="EN-US">make</span><span style="font-family: 宋体;">就成功了。需要注意的有以下几点：默认的编译是不支持</span><span lang="EN-US">STL</span><span style="font-family: 宋体;">的，可以通过编辑</span><span class="SpellE"><span lang="EN-US">Makefile</span></span><span style="font-family: 宋体;">的</span><span lang="EN-US">TINYXML_USE_STL := NO</span><span style="font-family: 宋体;">那一行，把</span><span lang="EN-US">NO</span><span style="font-family: 宋体;">改成</span><span lang="EN-US">YES</span><span style="font-family: 宋体;">就可以支持</span><span lang="EN-US">STL</span><span style="font-family: 宋体;">了；还有默认只生成了一个测试程序，没有生成任何库，如果要生成静态库的话，可以用</span><span class="SpellE"><span lang="EN-US">ar</span></span><span style="font-family: 宋体;">命令，将生成的几个目标文件打包就行了，如果要生成动态库，则需要加上</span><span lang="EN-US">-<span class="SpellE">fpic</span></span><span style="font-family: 宋体;">参数重新编译。</span></p>
<h3 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>3.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">使用</span></h3>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">构建了相应的库之后，在使用了它们的工程中，只要在连接时把他们连上就行了。需要注意的是，如果需要</span><span lang="EN-US">STL</span><span style="font-family: 宋体;">支持，在编译用到了</span><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">的文件时，需要定义一个宏</span><span lang="EN-US">TIXML_USE_STL</span><span style="font-family: 宋体;">，对</span><span class="SpellE"><span lang="EN-US">gcc</span></span><span style="font-family: 宋体;">，可以使用参数</span><span lang="EN-US">-DTIXML_USE_STL</span><span style="font-family: 宋体;">，对</span><span lang="EN-US">cl.exe</span><span style="font-family: 宋体;">（</span><span lang="EN-US">VC</span><span style="font-family: 宋体;">），可以使用参数</span><span lang="EN-US">/DTIXML_USE_STL</span><span style="font-family: 宋体;">，如果嫌麻烦，可以直接定义在</span> <span class="SpellE"><span lang="EN-US">tinyxml.h</span></span><span style="font-family: 宋体;">文件里。</span></p>
<p class="MsoNormal"><span lang="EN-US">
<p>&nbsp;</p>
</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>三、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span lang="EN-US">TinyXml</span><span style="font-family: 黑体;">的编程模型</span></h2>
<h3 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">类之间的关系</span></h3>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">实现的时</span><span lang="EN-US">DOM</span><span style="font-family: 宋体;">访问模型，因此提供了一系列的类对应</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文件中的各个节点。<span class="GramE">主要类间的</span>关系如下图所示：<br></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;"><img  src="http://www.grinninglizard.com/tinyxmldocs/classTiXmlNode.png" alt="类结构图"></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US"><shapetype id="_x0000_t75"></shapetype><stroke></stroke>
<formulas>
</formulas>
<f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f><f></f>
<path></path>
<lock v:ext="edit" aspectratio="t"></lock><shape id="_x0000_i1025" style="width: 415.5pt; height: 81pt;"></shape><imagedata o:title="classTiXmlBase"></imagedata></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="SpellE"><span lang="EN-US">TiXmlBase</span></span><span style="font-family: 宋体;">：其他类的基类，是个抽象类</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="SpellE"><span lang="EN-US">TiXmlNode</span></span><span style="font-family: 宋体;">：表示一个节点，包含节点的一般方法，如<span class="GramE">访问自</span>节点、兄弟节点、编辑自身、编辑子节电</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="SpellE"><span lang="EN-US">TiXmlDocument</span></span><span style="font-family: 宋体;">：表示整个</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文档，不对应其中某个特定的节点。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="SpellE"><span lang="EN-US">TiXmlElement</span></span><span style="font-family: 宋体;">：表示元素节点，可以包含子节点和</span><span class="SpellE"><span lang="EN-US">TiXmlAttribute</span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="SpellE"><span lang="EN-US">TiXmlComment</span></span><span style="font-family: 宋体;">：表示注释</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="SpellE"><span lang="EN-US">TiXmlDeclaration</span></span><span style="font-family: 宋体;">：表示声明</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="SpellE"><span lang="EN-US">TiXmlText</span></span><span style="font-family: 宋体;">：表示文本节点</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="SpellE"><span lang="EN-US">TiXmlUnknown</span></span><span style="font-family: 宋体;">：表示未知节点，通常是出错了</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="SpellE"><span lang="EN-US">TiXmlAttribute</span></span><span style="font-family: 宋体;">：表示一个元素的属性</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">下面是一个简单的例子：</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="GramE"><span style="color: blue;" lang="EN-US"></span></span></p>
<span class="Code">
<p class="MsoNormal" style="text-indent: 21pt;"><span class="GramE"><span style="color: blue;" lang="EN-US">&lt;?xml</span></span><span style="color: blue;" lang="EN-US"> version="1.0" encoding="utf-8" ?&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;!-This is only a sample--&gt;
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;&nbsp;&nbsp; <span style="color: blue;" lang="EN-US">&lt;<span class="GramE">book</span>&gt;
<p>&nbsp;<span style="color: blue;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;<span class="GramE">name&gt;</span>TinyXml How To&lt;/name&gt;</span><br></p>
</span></p>
</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="color: blue;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;price unit=&#8221;RMB&#8221;&gt;20&lt;/price&gt;
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;<span style="color: blue;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;<span class="GramE">description&gt;</span>Some words&#8230;&lt;/description&gt;
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;<span style="color: blue;" lang="EN-US">&lt;/ book &gt;</span></p>
</span></p>
</span></p>
</span>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="color: blue;" lang="EN-US">
<p class="MsoNormal" style="text-indent: 21pt;"><span style="color: blue;" lang="EN-US">
<p class="MsoNormal" style="text-indent: 21pt;"><span style="color: blue;" lang="EN-US">
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-family: 宋体; color: #000000;">整个文档，对应</span><span class="SpellE" style="color: #000000;"><span lang="EN-US">TiXmlDocument</span></span></p>
</span></p>
</span></p>
</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span class="SpellE"><span lang="EN-US">book,name,price</span></span><span lang="EN-US">, description</span><span style="font-family: 宋体;">，都对应</span><span class="SpellE"><span lang="EN-US">TiXmlElement</span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">第一行对应一个</span><span class="SpellE"><span lang="EN-US">TiXmlDeclaration</span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">第二行对应一个</span><span class="SpellE"><span lang="EN-US">TiXmlComment</span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">&#8220;TinyXml How To&#8221;</span><span style="font-family: 宋体;">对应一个</span><span class="SpellE"><span lang="EN-US">TiXmlText</span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">unit</span><span style="font-family: 宋体;">则是</span><span lang="EN-US">price</span><span style="font-family: 宋体;">的一个</span><span class="SpellE"><span lang="EN-US">TiXmlAttribute</span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">这些类与</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文件中的相应元素都有很好的对应关系，因此相信参照</span><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">的文档，可以很容易的掌握各个方法的使用。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">
<p>&nbsp;<br></p>
</span></p>
<h3 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体;">需要注意的问题</span></h3>
<p class="MsoNormal" style="text-indent: 21pt;"><strong><span style="font-family: 宋体;">各类之间的转换</span><span lang="EN-US">  </span></strong></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">由于各个<span class="GramE">节点类都从</span></span><span class="SpellE"><span lang="EN-US">TiXmlNode</span></span><span style="font-family: 宋体;">继承，在使用时常常需要将</span><span class="SpellE"><span lang="EN-US">TiXmlNode</span></span><span lang="EN-US">*</span><span style="font-family: 宋体;">类型的指针转换为其派生类的指针，在进行这种转换时，应该首先使用由</span><span class="SpellE"><span lang="EN-US">TiXmlNode</span></span><span style="font-family: 宋体;">类提供的一系列转换函数，如</span><span class="SpellE"><span lang="EN-US">ToElement</span></span><span lang="EN-US">(void)</span><span style="font-family: 宋体;">，而不是</span><span lang="EN-US">c++</span><span style="font-family: 宋体;">的</span><span class="SpellE"><span lang="EN-US">dynamic_cast</span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;<strong><span style="font-family: 宋体;">检查返回值</span><span lang="EN-US">
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;<span style="font-family: 宋体;">由于</span><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">是一个非校验的解析器，因此当解析一个文件时，很可能文件并不包含我们预期的某个节点，在这种情况下，</span><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">将返回空指针。因此，必须要对返回值进行检查，否则将很容易出现内存访问的错误。</span></p>
</span></strong></p>
</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;<strong><span style="font-family: 宋体;">如何重头建立一个</span><span lang="EN-US">XML</span></strong><strong><span style="font-family: 宋体;">文件</span><span lang="EN-US">
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;<span style="font-family: 宋体;">先建立一个</span><span class="SpellE"><span lang="EN-US">TiXmlDocument</span></span><span style="font-family: 宋体;">对象，然后，载入某个模板，或者直接插入一个节点作为根节点，接着就可以像打开一个已有的</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文件那样对它进行操作了。</span></p>
</span></strong></p>
</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">
<p>&nbsp;<br></p>
</span></p>
<h2 style="margin-left: 21pt; text-indent: -21pt;"><span lang="EN-US"><span>四、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 黑体;">总结</span></h2>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">TinyXml</span><span style="font-family: 宋体;">最大的特点就是它很小，可以很方便的静态连接到程序里。对于像配置文件、简单的数据文件这类文件的解析，它很适合。但是由于它是非验证的，因此需要在程序里做许多检查工做，加重了程序编写的负担。因此对于复杂的</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">文件，我觉得最好还是用验证的解析器来处理。</span></p>
<br>  <img src ="http://www.cppblog.com/yehongly/aggbug/61678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yehongly/" target="_blank">茶</a> 2008-09-12 14:12 <a href="http://www.cppblog.com/yehongly/archive/2008/09/12/61678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>