一个轻量级的XML解析器,对大文件有效吗?

时间:2009-06-17 11:53:15

标签: c++ xml parsing sax saxparser

我需要解析潜在的巨大XML文件,所以我猜这会排除DOM解析器。

是否有适用于C ++的优秀轻量级SAX解析器,与足迹上的TinyXML相比? XML的结构非常简单,不需要像名称空间和DTD这样的高级内容。只是元素,属性和cdata。

我知道Xerces,但是超过50mb的超大尺寸让我感到不安。

谢谢!

9 个答案:

答案 0 :(得分:7)

如果您使用的是C,则可以使用LibXML项目中的Gnome。您可以选择DOM和SAX接口到您的文档,以及多年来开发的许多其他功能。如果你真的想要C ++,那么你可以使用libxml++,这是围绕LibXML的C ++ OO包装。

该库经过一次又一次的验证,性能卓越,几乎可以在任何平台上编译。

答案 1 :(得分:6)

我喜欢ExPat
http://expat.sourceforge.net/

它是基于C的,但有几个C ++包装器可以提供帮助。

答案 2 :(得分:4)

RapidXML是用C ++编写的XML的快速解析器。

答案 3 :(得分:2)

http://sourceforge.net/projects/wsdlpull这是java xmlpull api的直接c ++端口(http://www.xmlpull.org/

我强烈推荐这个解析器。我必须自定义它以便在我的嵌入式设备上使用(没有STL支持),但我发现它非常快,只需很少的开销。我必须创建自己的字符串和向量类,即使是那些它在Windows上编译为大约60k。

我认为拉解析比SAX更直观。代码更接近镜像xml文档,使两者易于关联。

唯一的缺点是它只是向前,这意味着你需要解析它们来的元素。我们有一个相当混乱的设计来读取我们的配置文件,我需要解析整个子树,进行一些检查,然后设置一些默认值然后再次解析。使用这个解析器,处理类似事情的唯一真正方法是制作状态的副本,用它解析,然后继续使用原始状态。它仍然最终在资源方面与我们的旧DOM解析器相比是一个巨大的胜利。

答案 4 :(得分:1)

如果您的XML结构非常简单,您可以考虑构建一个基于lex / yacc(flex / bison)的简单词法分析器/扫描器。 W3C的消息来源可能会激励您:http://www.w3.org/XML/9707/parser.yhttp://www.w3.org/XML/9707/scanner.l

另请参阅SAX2 interface in libxml

答案 5 :(得分:1)

firstobject的CMarkup是一个C ++类,它作为一个轻量级的大文件拉解析器(我推荐一个拉解析器而不是SAX),以及一个巨大的XML文件编写器。它为您的可执行文件增加了大约250kb。当在内存中使用时,它通过一个用户的报告占用tinyxml的1/3。在大文件上使用时,它只在内存中保存一个小缓冲区(如16kb)。 CMarkup目前是一种商业产品,因此它受支持,记录并设计为易于使用单个cpp和h文件添加到您的项目中。

最简单的尝试方法是使用免费的firstobject XML编辑器中的脚本,例如:

ParseHugeXmlFile()
{
  CMarkup xml;
  xml.Open( "HugeFile.xml", MDF_READFILE );
  while ( xml.FindElem("//record") )
  {
    // process record...
    str sRecordId = xml.GetAttrib( "id" );
    xml.IntoElem();
    xml.FindElem( "description" );
    str sDescription = xml.GetData();
  }
  xml.Close();
}

从“文件”菜单中选择“新建程序”,将其粘贴并修改为您的元素和属性,按F9运行它或按F10逐行逐步执行。

答案 6 :(得分:1)

你可以尝试https://github.com/thinlizzy/die-xml。它看起来非常小而且易于使用

这是最近制作的C ++ 0x XML SAX解析器开源,作者愿意反馈

它解析输入流并在与std :: function

兼容的回调上生成事件 堆栈机器使用有限自动机作为后端,并且一些事件(开始标记和文本节点)使用迭代器以最小化缓冲,使其非常轻量级

答案 7 :(得分:0)

如果你想要小而快,我会看 generate a DTD/Schema-specific parser的工具。这些对于大型文档非常有用。

答案 8 :(得分:-1)

我强烈推荐pugixml

pugixml是一个轻量级的C ++ XML处理库。

“pugixml是一个C ++ XML处理库,它包含一个具有丰富遍历/修改功能的类DOM接口,一个从XML文件/缓冲区构建DOM树的极快的XML解析器,以及一个XPath复杂数据驱动树查询的1.0实现。还提供完整的Unicode支持,Unicode接口变体和不同Unicode编码之间的转换。“

在商业产品中选择和使用pugixml之前,我已经测试了一些XML解析器,包括一些昂贵的解析器。

pugixml不仅是最快的解析器,而且还拥有最成熟和最友好的API。我强烈推荐它。这是非常稳定的产品!我从0.8版开始使用它。现在是1.7。

这个解析器的巨大好处是XPath 1.0实现!对于任何更复杂的树查询,XPath是上帝发送的功能!

具有丰富的遍历/修改功能的类似DOM的界面对于处理现实生活中的“繁重”XML文件非常有用。

它是一个小巧,快速的解析器。如果您不介意链接C ++代码,即使是iOS或Android应用程序也是不错的选择。

基准可以说明很多。请参阅:http://pugixml.org/benchmark.html

(x86)的几个例子:

pugixml is more than 38 times faster than TinyXML

                    4.1 times faster than CMarkup,

                    2.7 times faster than expat or libxml

For(x64)pugixml是我所知道的最快的解析器。

还检查XML解析器对内存的使用情况。有些解析器只是狼吞虎咽!