`
810364804
  • 浏览: 779420 次
文章分类
社区版块
存档分类
最新评论

rapidxml,一个快速的xml库,Boost库默认的XML解析器

 
阅读更多

近来找到一个快速的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 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();
}


前两天有朋友问,我的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文件

    RapidXml读取并修改XML文件,封装成单独的类,可以直接使用,调用也非常方便

    TinyXML是一个开源的解析XML的解析库

    TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。 这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便...

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xml

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava...

    C++ XML文件解析库 tinyxml2

    TinyXML2是simple、small、efficient开源的C++ XML文件解析库,可以很方便的应用到现有的项目之中。非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。

    适合嵌入式系统的开源XML解析器

    minixml是适合嵌入式系统的xml解析器,支持dom

    XML解析器示例

    LabVIEW XML解析器示例, 包含xml加载,保存,解析等功能

    解析xml解析xml解析xml解析xml解析xml

    解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml

    STM32解析XML

    STM32f107应用minixml库解析xml,成功解析,软件仿真通过。适合初次接触STM32解析xml的童鞋们。

    xml 解析器,xml 解析器,xml 解析器,

    xml 解析器,xml 解析器xml 解析器xml 解析器xml 解析器

    XML解析工具

    读取和设置xml配置文件是最常用的...TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

    TinyXML解析库

    TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)...

    开源xml解析库TingXml。

    目前,对xml的使用非常广泛,读取和设置xml配置文件是我们最常用的操作。常见C/C++ XML解析器有Tinyxml、XERCES、...这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

    XML解析库

    XML解析库,XML 解析 XML解析

    pugixml, 带有XPath支持的C++的轻量级简单和快速XML解析器.zip

    pugixml, 带有XPath支持的C++的轻量级简单和快速XML解析器 pugixml pugixml是一个 C++ XML处理库,由具有丰富遍历/修改功能的DOM和基于XML的超快速XML解析器组成,用于构造XML树和复杂的数据驱动树查询的XPath 1.0...

    数据解析,小型 XML 解析库

    Mini-XML 是一个小型 XML 解析库,您可以使用它来读取应用程序中的 XML 数据文件或字符串,而无需大型非标准库 读取 UTF-8 和 UTF-16 并写入 UTF-8 编码的 XML 文件和字符串。 数据存储在链表树结构中,保留 XML ...

    最快速XML解析器-foxechs

    最快速XML解析器-foxechs,可以支持容错处理,在WIN7下运行

    XML解析器,用于解析XML文件

    用于解析XML文件用于解析XML文件用于解析XML文件用于解析XML文件用于解析XML文件用于解析XML文件用于解析XML文件用于解析XML文件用于解析XML文件

    解析XML文档 实现树结构实例

    开发环境为VC,基于对话框,用msxml组件解析XML文档,运用递归循环的方法实现树结构,支持中文,可以运行的一个实例。

    易语言 xml解析 易语言 xml解析 教程 带源码

    易语言 xml解析 易语言 xml解析 易语言 xml解析 易语言 xml解析 易语言 xml解析 易语言 xml解析 易语言 xml解析 教程 带源码

    Ruby-Ox一个快速的XML解析器

    Ox - 一个快速的XML解析器

Global site tag (gtag.js) - Google Analytics