代码之家  ›  专栏  ›  技术社区  ›  Alex Jenter

大型文件的轻量级XML解析器?

  •  8
  • Alex Jenter  · 技术社区  · 16 年前

    我需要解析可能巨大的XML文件,所以我想这排除了DOM解析器的可能性。

    是否有任何优秀的轻量级SAX解析器用于C++,与TinyXML相比,足迹? XML的结构非常简单,不需要名称空间和DTD之类的高级东西。只有元素、属性和CDATA。

    我知道Xerces,但它超过50MB的体积让我发抖。

    谢谢!

    9 回复  |  直到 6 年前
        1
  •  7
  •   Tony Miller    16 年前

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

    这个库已经一次又一次地被证明是高性能的,并且可以在几乎任何你能找到的平台上编译。

        2
  •  6
  •   Loki Astari    16 年前

    我喜欢外国人
    http://expat.sourceforge.net/

    它是基于C的,但是有几个C++包装来帮助。

        3
  •  4
  •   dtw    15 年前

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

        4
  •  2
  •   Dolphin    16 年前

    http://sourceforge.net/projects/wsdlpull 这是Java XMLRAP API的一个直的C++端口。 http://www.xmlpull.org/ )

    我强烈推荐这个解析器。我必须定制它以在我的嵌入式设备上使用(没有STL支持),但我发现它非常快,开销很小。我必须创建自己的字符串和向量类,即使有了这些类,它在Windows上也能编译到大约60K。

    我认为pull解析比SAX更直观。代码更紧密地反映了XML文档,从而更容易将两者关联起来。

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

        5
  •  1
  •   Pierre    16 年前

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

    也见 SAX2 interface in libxml

        6
  •  1
  •   Ben Bryant    15 年前

    第一对象 CMarkup 是一个C++类,它作为一个轻量级的大文件拉解析器(我推荐一个拉解析器而不是SAX)和巨大的XML文件编写器。可执行文件的大小总计约为250KB。当在内存中使用时,一个用户的报告显示它有1/3的tinyxml足迹。当用于大型文件时,它只在内存中保存一个小的缓冲区(如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逐行执行它。

        7
  •  1
  •   thinlizzy    6 年前

    你可以试试 https://github.com/thinlizzy/die-xml . 它看起来很小,很容易使用

    这是一个最近开发的C++ 0xXML SAX解析器开源程序,作者愿意反馈

    它解析输入流并在与std::函数兼容的回调上生成事件。

    堆栈机器使用有限自动机作为后端,一些事件(开始标记和文本节点)使用迭代器以最小化缓冲,使其非常轻。

        8
  •  0
  •   Ira Baxter    15 年前

    我会看看那些 generate a DTD/Schema-specific parser 如果你想要小而快。这些对大文件来说非常有用。

        9
  •  -1
  •   sg7 Krafty Coder    9 年前

    我强烈推荐 pugixml

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

    PuGXML是一个C++ XML处理库,它由一个DOM类接口组成,具有丰富的遍历/修改能力,一个非常快速的XML解析器,它从一个XML文件/缓冲器构建DOM树,并为复杂的数据驱动树查询提供一个XPath 1实现。还提供完整的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
    

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

    同时检查XML解析器对内存的使用情况。一些解析器刚刚吞噬了宝贵的记忆!