我需要解析潜在的巨大 XML 文件,所以我猜这排除了 DOM 解析器。
是否有任何用于 C++ 的轻量级 SAX 解析器,可与 TinyXML 在占用空间上相媲美?XML 的结构非常简单,不需要像名称空间和 DTD 之类的高级东西。只是元素、属性和 cdata。
我知道 Xerces,但它超过 50mb 的绝对大小让我不寒而栗。
谢谢!
我喜欢 ExPat
http://expat.sourceforge.net/
它是基于 C 的,但有几个 C++ 包装器可以提供帮助。
RapidXML是一个用 C++ 编写的非常快速的 XML 解析器。
http://sourceforge.net/projects/wsdlpull 这是 java xmlpull api ( http://www.xmlpull.org/ )的直接 c++ 端口
我强烈推荐这个解析器。我必须定制它以在我的嵌入式设备上使用(不支持 STL),但我发现它非常快且开销很小。我必须制作自己的字符串和向量类,即使在 Windows 上编译到大约 60k 的那些。
我认为拉解析比 SAX 之类的更直观。该代码更紧密地反映了 xml 文档,因此可以轻松地将两者关联起来。
一个缺点是它只是向前的,这意味着您需要在元素到来时对其进行解析。我们有一个相当混乱的设计来读取我们的配置文件,我需要解析整个子树,进行一些检查,然后设置一些默认值,然后再次解析。使用此解析器,处理此类事情的唯一真正方法是制作状态副本,用它进行解析,然后继续使用原始状态。与我们的旧 DOM 解析器相比,它在资源方面仍然是一个巨大的胜利。
如果您的 XML 结构非常简单,您可以考虑基于 lex/yacc (flex/bison) 构建一个简单的词法分析器/扫描器。W3C 的资源可能会启发您:http ://www.w3.org/XML/9707/parser.y和http://www.w3.org/XML/9707/scanner.l。
firstobject 的CMarkup是一个 C++ 类,它作为一个轻量级的大文件拉解析器(我推荐拉解析器而不是 SAX)和大 XML 文件编写器。它为您的可执行文件添加了大约 250kb。根据一位用户的报告,当在内存中使用时,它的占用空间是 tinyxml 的 1/3。当用于大文件时,它只在内存中保存一个小缓冲区(如 16kb)。CMarkup 目前是一种商业产品,因此它受到支持、记录和设计,可以通过单个 cpp 和 h 文件轻松添加到您的项目中。
尝试它的最简单方法是使用免费的 firstobject XML 编辑器中的脚本,例如:
ParseHugeXmlFile() { C标记xml; xml.Open("HugeFile.xml", MDF_READFILE); while ( xml.FindElem("//record") ) { // 进程记录... str sRecordId = xml.GetAttrib("id"); xml.IntoElem(); xml.FindElem("描述"); str sDescription = xml.GetData(); } xml.关闭(); }
从“文件”菜单中,选择“新建程序”,将其粘贴进去并针对您的元素和属性进行修改,按 F9 运行它或按 F10 逐行逐行执行。
你可以试试https://github.com/thinlizzy/die-xml。它似乎非常小且易于使用
这是一个最近开源的 C++0x XML SAX 解析器,作者愿意反馈
它解析输入流并在与 std::function 兼容的回调上生成事件
堆栈机器使用有限自动机作为后端,一些事件(开始标签和文本节点)使用迭代器来最小化缓冲,使其非常轻量级
如果您想要小而快,我会查看生成特定于 DTD/Schema 的解析器的工具。这些对于大型文档非常有用。
我强烈推荐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 解析器对内存的使用情况。一些解析器只是吞噬宝贵的内存!