Posted on 2010-04-02 16:43 
Condor 阅读(1852) 
评论(2)  编辑 收藏 引用  
			 
			
		 
		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的主要接口类
 TinyXML主要接口类 
RapidXML的主要接口类
 class TiXmlDocument 
template<class Ch = char> 
class xml_document
 class TiXmlNode 
template<class Ch = char> 
class xml_node
 class TiXmlAttribute 
template<class Ch = char> 
class xml_attribute
 下面还是看一个具体的例子来体验一下,下面是TinyXML官方教程中创建XML文档的一段代码:
  void build_simple_doc( ) 
{ 
// Make xml: <?xml ..><Hello>World</Hello> 
TiXmlDocument doc; 
TiXmlDeclaration * decl = new TiXmlDeclaration( “1.0″, “”, “” ); 
TiXmlElement * element = new TiXmlElement( “Hello” ); 
TiXmlText * text = new TiXmlText( “World” ); 
element->LinkEndChild( text ); 
doc.LinkEndChild( decl ); 
doc.LinkEndChild( element ); 
doc.SaveFile( “madeByHand.xml” ); 
}
 下面是使用RapidXML实现类似功能的代码:
  void build_simple_doc_by_rapidxml() 
{ 
xml_document<> doc; 
xml_node<>* decl = doc.allocate_node(node_declaration); 
xml_attribute<>* decl_ver = 
doc.allocate_attribute(“version”, “1.0″); 
decl->append_attribute(decl_ver); 
doc.append_node(decl);
 xml_node<>* node = 
doc.allocate_node(node_element,    “Hello”, “World”); 
doc.append_node(node);
 string text; 
rapidxml::print(std::back_inserter(text), doc, 0);
 // write text to file by yourself 
}
 下面是使用RapidXML分析XML的样例代码:
  void parse_doc_by_rapidxml(char* xml_doc) 
{ 
xml_document<> doc;        // character type defaults to char 
doc.parse<0>(xml_doc);  // 0 means default parse flags
 xml_node<> *node = doc.first_node(“Hello”); 
string node_val = node->value(); 
}
 好东西,大家分享!:D