rapidxml,一个快速的xml库
来源:互联网 发布:网络电视排行 编辑:程序博客网 时间:2024/06/05 01:53
http://www.cppblog.com/singohgod/archive/2010/11/15/133685.html
近来找到一个快速的xml库,试用了一下,方法和现在使用的tinyxml差不多,很容易上手,如果有机会可以移植到项目里面试试
自从用了xml后对他是又爱又恨,他的确能代替配置文件,但是当文件容量大到一定量的时候灾难就降临了,比如读取一个50M的xml文件,往往读取花上10秒,解析再花上20秒,还要占用大量内存空间,十分头痛.所以实际项目中都会将xml再转为二进制文件来处理,但是xml的灵活性的确很方便,如果rapidxml能接近二进制的速度,当然就太好啦,还没有测试过,下面是一些介绍.
貌似tinyxml会遇到unicode障碍,rapidxml不会,如果项目要做多语言版本就必须面临解决这个问题...
rapidxml是一个快速的xml库,官方网站: http://rapidxml.sourceforge.net/,根据manual看到,他竟然比tinyxml快了50-100倍
目前我公司开发的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的主要接口类
TinyXML主要接口类RapidXML的主要接口类class TiXmlDocumenttemplate<class Ch = char>class xml_documentclass TiXmlNodetemplate<class Ch = char>
class xml_nodeclass TiXmlAttributetemplate<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 flagsxml_node<> *node = doc.first_node(“Hello”);
string node_val = node->value();
}
前两天有朋友问,我的SlimXml有没有和RapidXml对比过效率?我是第一次听说这个库,更不用说对比效率了,于是上他们网站看了下。
好家伙,居然号称比TinyXml快30~60倍,而且是Boost.PropertyTree的默认xml解析器。
于是有点好奇,因为以前也没有特别关心过SlimXml的效率。
于是分别下载了TinyXml-2.6.1和RapidXml-1.13,迅速用vc8建立了两个测试工程,在系统中搜”*.xml”,找到了一个比较合适的测试文件。它足够大(1.5M),utf-8编码并且包含中/英文,有一定层次深度,大约3.3万行。测试文件可以从这里下载
测试对象是三个库从内存字符串解析xml的函数,这样能排除从硬盘上读文件这种不稳定因素的干扰,而且RapidXml貌似只支持从内存里解析
- slim::XmlDocument::loadFromMemory()
- TiXmlDocument::Parse()
- rapidxml::xml_document<char>::parse<flag>()
要说明的是,RapidXml的这个parse是一个模板函数,必须给一个flag的参数,我测试的时候给的是默认的0
测试结果,解析这个3.3万行,1.5M大小的xml,三个库分别花了
- SlimXml: 22ms
- TinyXml: 54ms
- RapidXml: 4ms!
结论是,RapidXml果然很强悍,居然比我的SlimXml快5倍多。但是并没有如作者所说比TinyXml快30~60倍,只有不到15倍。据说对比用的是一个约50k大小的xml文件,可惜并没有提供下载,不然可以验证一下。
比较欣慰的是,在我并没有很关注效率的情况下,SlimXml仍然比TinyXml快2.5倍。SlimXml走的是简单小巧路线,源代码只有32k,而TinyXml和RapidXml的源码分别是147k和141k,有这样的效率可以满意了。在我有很多空闲以前,估计我也不会再去优化它,因为这个库主要还是针对几十上百行的小文件,解析特别大的xml不在我考虑的范围之内。
以下是RapidXml提供的常见xml库效率对照表,其中还很牛鼻地提供了和strlen()函数的效率对比
- rapidxml,一个快速的xml库
- rapidxml,一个快速的xml库
- rapidxml,一个快速的xml库
- rapidxml,一个快速的xml库,Boost库默认的XML解析器
- XML解析库RapidXML
- 使用rapidxml解析xml
- 使用rapidxml创建XML
- 读取Xml: RapidXml
- rapidxml操作XML
- 使用RapidXML读写XML文件
- XML之TinyXML推荐RapidXML
- 使用rapidxml 生成xml文件
- rapidxml读取xml文件操作
- 使用rapidxml读写xml文件
- RapidXML的使用
- rapidxml的简单封装
- rapidxml的alloc_func错误
- RAPIDxml的使用
- 3个字节的空txt文本文件——utf8
- C/C++预处理指令
- bat运行java文件(含参数文件)
- Android通过JNI调用驱动程序(完全解析实例)
- web框架表现层,业务层,持久层的特点
- rapidxml,一个快速的xml库
- 修改文件的隐藏属性
- Java线程:线程的同步与锁
- 在eclipse中修改java web项目的名称
- 3.EL入门:布尔值
- Git分支管理策略
- HttpSQS
- uboot分析之bootm_start
- js中 onbeforepaste【鸡蛋】