<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; hkx1n</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/hkx1n/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 13:40:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>游戏配置之 XML</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/11/30/xml/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/11/30/xml/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 08:10:28 +0000</pubDate>
		<dc:creator>hkx1n</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/11/30/xml/</guid>
		<description><![CDATA[游戏开发中配置文件主要有ini个xml，xml用的更多些。 我用的较多的库是tinyXML，一般应用已足矣胜任，网上教程一大堆，就不写了。再次介绍另一个xml库，转载的其他人的blog的文章。 目前我公司开发的Nexus Engine的底层对象序列化使用了TinyXML来读写XML文件。TinyXML有两个不爽的地方，一是它的接口使用FILE*，另外一个是它对 wchar_t不能很好的支持。前阵子看Boost库的更新中多了一个PropertyTree，他在处理XML时用到了另外一个小的库 --RapidXML。既然间接的是Boost库的一部分，所以是值得一试的。于是找到其官方网站（http://rapidxml.sourceforge.net/ ）研究了一番。一看之下，甚是满意，也推荐给大家看看！ 首先就是速度，据它自己宣称比TinyXML快30到60倍 ，比Xerces DOM快50到100倍！详细的测试比较请见其用户手册（http://rapidxml.sourceforge.net/manual.html ）的“4. Performance ”一节。 其次它的设计非常的简洁，只依赖于标准库中的几个基本的类。它的输入输出都是字符串，这样很好，一个库就应该关注自己核心的内容，做尽量少的事情。它的API其实和TinyXML倒是有几分相似，用过TinyXML的人应该很容易上手： TinyXML主要接口类 RapidXML的主要接口类 class TiXmlDocument template class xml_document class TiXmlNode template class xml_node class TiXmlAttribute template class xml_attribute 下面还是看一个具体的例子来体验一下，下面是TinyXML官方教程中创建XML文档的一段代码： view plaincopy to clipboardprint? void build_simple_doc( ) { // Make xml: World TiXmlDocument doc; TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" [...]]]></description>
			<content:encoded><![CDATA[<p>游戏开发中配置文件主要有ini个xml，xml用的更多些。<br />
我用的较多的库是tinyXML，一般应用已足矣胜任，网上教程一大堆，就不写了。再次介绍另一个xml库，转载的其他人的blog的文章。<br />
目前我公司开发的Nexus Engine的底层对象序列化使用了TinyXML来读写XML文件。TinyXML有两个不爽的地方，一是它的接口使用FILE*，另外一个是它对 wchar_t不能很好的支持。前阵子看Boost库的更新中多了一个PropertyTree，他在处理XML时用到了另外一个小的库 --RapidXML。既然间接的是Boost库的一部分，所以是值得一试的。于是找到其官方网站（http://rapidxml.sourceforge.net/ ）研究了一番。一看之下，甚是满意，也推荐给大家看看！<br />
首先就是速度，据它自己宣称比TinyXML快30到60倍 ，比Xerces DOM快50到100倍！详细的测试比较请见其用户手册（http://rapidxml.sourceforge.net/manual.html ）的“4. Performance ”一节。<br />
其次它的设计非常的简洁，只依赖于标准库中的几个基本的类。它的输入输出都是字符串，这样很好，一个库就应该关注自己核心的内容，做尽量少的事情。它的API其实和TinyXML倒是有几分相似，用过TinyXML的人应该很容易上手：<br />
TinyXML主要接口类 RapidXML的主要接口类<br />
class TiXmlDocument template<br />
class xml_document</p>
<p>class TiXmlNode template<br />
class xml_node</p>
<p>class TiXmlAttribute template<br />
class xml_attribute<br />
下面还是看一个具体的例子来体验一下，下面是TinyXML官方教程中创建XML文档的一段代码：<br />
view plaincopy to clipboardprint?<br />
void build_simple_doc( )<br />
{<br />
// Make xml: World<br />
TiXmlDocument doc;<br />
TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );<br />
TiXmlElement * element = new TiXmlElement( "Hello" );<br />
TiXmlText * text = new TiXmlText( "World" );<br />
element-&gt;LinkEndChild( text );<br />
doc.LinkEndChild( decl );<br />
doc.LinkEndChild( element );<br />
doc.SaveFile( "madeByHand.xml" );<br />
}<br />
void build_simple_doc( )<br />
{<br />
// Make xml: World<br />
TiXmlDocument doc;<br />
TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );<br />
TiXmlElement * element = new TiXmlElement( "Hello" );<br />
TiXmlText * text = new TiXmlText( "World" );<br />
element-&gt;LinkEndChild( text );<br />
doc.LinkEndChild( decl );<br />
doc.LinkEndChild( element );<br />
doc.SaveFile( "madeByHand.xml" );<br />
}</p>
<p>下面是使用RapidXML实现类似功能的代码：<br />
view plaincopy to clipboardprint?<br />
void build_simple_doc_by_rapidxml()<br />
{<br />
xml_document doc;<br />
xml_node* decl = doc.allocate_node(node_declaration);<br />
xml_attribute* decl_ver =<br />
doc.allocate_attribute("version", "1.0");<br />
decl-&gt;append_attribute(decl_ver);<br />
doc.append_node(decl);<br />
xml_node* node =<br />
doc.allocate_node(node_element, "Hello", "World");<br />
doc.append_node(node);<br />
string text;<br />
rapidxml::print(std::back_inserter(text), doc, 0);<br />
// write text to file by yourself<br />
}<br />
void build_simple_doc_by_rapidxml()<br />
{<br />
xml_document doc;<br />
xml_node* decl = doc.allocate_node(node_declaration);<br />
xml_attribute* decl_ver =<br />
doc.allocate_attribute("version", "1.0");<br />
decl-&gt;append_attribute(decl_ver);<br />
doc.append_node(decl);<br />
xml_node* node =<br />
doc.allocate_node(node_element, "Hello", "World");<br />
doc.append_node(node);<br />
string text;<br />
rapidxml::print(std::back_inserter(text), doc, 0);<br />
// write text to file by yourself<br />
}<br />
下面是使用RapidXML分析XML的样例代码：<br />
view plaincopy to clipboardprint?<br />
void parse_doc_by_rapidxml(char* xml_doc)<br />
{<br />
xml_document doc; // character type defaults to char<br />
doc.parse(xml_doc); // 0 means default parse flags<br />
xml_node *node = doc.first_node("Hello");<br />
string node_val = node-&gt;value();<br />
}<br />
void parse_doc_by_rapidxml(char* xml_doc)<br />
{<br />
xml_document doc; // character type defaults to char<br />
doc.parse(xml_doc); // 0 means default parse flags<br />
xml_node *node = doc.first_node("Hello");<br />
string node_val = node-&gt;value();<br />
}</p>
<p>首先上一个简单的xml写文件<br />
如下:<br />
#include<br />
#include<br />
#include<br />
#include</p>
<p>using namespace rapidxml;</p>
<p>int main()<br />
{<br />
xml_document doc;<br />
xml_node * rot = doc.allocate_node(rapidxml::node_pi,doc.allocate_string( " xml version='1.0' encoding='utf-8' " ));<br />
doc.append_node(rot);<br />
xml_node * node = doc.allocate_node(node_element, " config " , " information " );<br />
xml_node * color = doc.allocate_node(node_element, " color " ,NULL);<br />
doc.append_node(node);<br />
node -&gt; append_node(color);<br />
color -&gt; append_node(doc.allocate_node(node_element, " red " , " 0.1 " ));<br />
color -&gt; append_node(doc.allocate_node(node_element, " green " , " 0.1 " ));<br />
color -&gt; append_node(doc.allocate_node(node_element, " blue " , " 0.1 " ));<br />
color -&gt; append_node(doc.allocate_node(node_element, " alpha " , " 1.0 " ));</p>
<p>xml_node * size = doc.allocate_node(node_element, " size " ,NULL);<br />
size -&gt; append_node(doc.allocate_node(node_element, " x " , " 640 " ));<br />
size -&gt; append_node(doc.allocate_node(node_element, " y " , " 480 " ));<br />
node -&gt; append_node(size);</p>
<p>xml_node * mode = doc.allocate_node(rapidxml::node_element, " mode " , " screen mode " );<br />
mode -&gt; append_attribute(doc.allocate_attribute( " fullscreen " , " false " ));<br />
node -&gt; append_node(mode);</p>
<p>std:: string text;<br />
rapidxml::print(std::back_inserter(text), doc, 0 );</p>
<p>std::cout &lt;&lt; text &lt;&lt; std::endl;</p>
<p>std::ofstream out ( " config.xml " );<br />
out &lt;&lt; doc;</p>
<p>system( " PAUSE " );<br />
return EXIT_SUCCESS;<br />
}</p>
<p>生成的xml文件为:</p>
<p>0.1<br />
0.1<br />
0.1<br />
1.0</p>
<p>640<br />
480</p>
<p>screen mode</p>
<p>说实话 感觉这个比较不错<br />
希望更多的人使用它!</p>
<p>接上篇<br />
本文主要涉及rapidxml读文件的操作</p>
<p>基本的步骤为<br />
首先获取xml文件数据<br />
然后分析数据<br />
获取节点<br />
获取属性<br />
获取名字<br />
获取值<br />
...</p>
<p>代码如下:<br />
#include<br />
#include<br />
#include<br />
#include</p>
<p>using namespace rapidxml;</p>
<p>int main()<br />
{<br />
file fdoc( " config.xml " );<br />
std::cout &lt;&lt; fdoc.data() &lt;&lt; std::endl;<br />
xml_document doc;<br />
doc.parse (fdoc.data());</p>
<p>std::cout &lt;&lt; doc.name() &lt;&lt; std::endl;</p>
<p>// ! 获取根节点<br />
xml_node * root = doc.first_node();<br />
std::cout &lt; name() &lt;&lt; std::endl;</p>
<p>// ! 获取根节点第一个节点<br />
xml_node * node1 = root -&gt; first_node();<br />
std::cout &lt; name() &lt;&lt; std::endl;</p>
<p>xml_node * node11 = node1 -&gt; first_node();<br />
std::cout &lt; name() &lt;&lt; std::endl;<br />
std::cout &lt; value() &lt;&lt; std::endl;</p>
<p>// ! 修改之后再次保存<br />
xml_node * size = root -&gt; first_node( " size " );<br />
size -&gt; append_node(doc.allocate_node(node_element, " w " , " 0 " ));<br />
size -&gt; append_node(doc.allocate_node(node_element, " h " , " 0 " ));</p>
<p>std:: string text;<br />
rapidxml::print(std::back_inserter(text),doc, 0 );</p>
<p>std::cout &lt;&lt; text &lt;&lt; std::endl;</p>
<p>std::ofstream out ( " config.xml " );<br />
out &lt;&lt; doc;</p>
<p>system( " PAUSE " );<br />
return EXIT_SUCCESS;<br />
}</p>
<p>生成的xml为:</p>
<p>0.1<br />
0.1<br />
0.1<br />
1.0</p>
<p>640<br />
480</p>
<p>screen mode</p>
<p>需要说明的是rapidxml明显有一个bug<br />
那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!</p>
<p>经过这2篇 基本上就可以使用xml了<br />
当然这里并没有涉及异常处理</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/11/30/xml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

