什么是 C++ 的最佳开放 XML 解析器? [复制]

Posted

技术标签:

【中文标题】什么是 C++ 的最佳开放 XML 解析器? [复制]【英文标题】:What is the best open XML parser for C++? [duplicate] 【发布时间】:2010-09-15 07:15:06 【问题描述】:

我正在寻找一个简单、干净、正确的 XML 解析器,以便在我的 C++ 项目中使用。我应该自己写吗?

【问题讨论】:

注:有一个关于how to pick an XML parser for C++的问题。 正如@NicolBolas 指出的那样,现在有一个更新的 *** 帖子提出了同样的问题:***.com/questions/9387610/… 请注意,我在上面引用的更新的 *** 帖子的投票数几乎与当前问题(截至 2014 年 12 月)一样多,并且答案的投票数比这里的答案多得多,而且非常棒,易于阅读的流程图。 【参考方案1】:

RapidXML 怎么样? RapidXML 是一个用 C++ 编写的非常快速和小型的 XML DOM 解析器。它主要针对嵌入式环境、计算机游戏或任何其他可用内存或 CPU 处理能力非常宝贵的应用程序。 RapidXML 在 Boost Software License 下获得许可,其源代码可免费获得。

特点

解析速度(包括DOM树 建设)的接近速度 strlen 函数在 相同的数据。 在现代 CPU(截至 2008 年)上, 解析器吞吐量约为 10 亿 每秒字符数。看 在线中的性能部分 手动。 代码占用内存小 并创建了 DOM 树。 仅标头实现, 简化集成过程。 简单的许可证,允许用于 几乎任何目的,无论是商业用途 和非商业的,没有任何 义务。 支持 UTF-8 和部分 UTF-16, UTF-32 编码。 可移植的源代码,没有 除了非常小的依赖项 C++ 标准库的子集。 这个子集太小了 如果使用,可以很容易地手动模拟 的标准库是不受欢迎的。

限制

解析器忽略 DOCTYPE 声明。 不支持 XML 命名空间。 解析器不检查 字符有效性。 解析器的接口没有 符合 DOM 规范。 解析器不检查 属性唯一性。

来源:wikipedia.org://Rapidxml


根据您的使用情况,您可能会使用 XML 数据绑定? CodeSynthesis XSD 是由 Code Synthesis 开发的用于 C++ 的 XML 数据绑定编译器,并在 GNU GPL 和专有许可下获得双重许可。给定一个 XML 实例规范(XML Schema),它会生成代表给定词汇表以及解析和序列化代码的 C++ 类。

CodeSynthesis XSD 的独特功能之一是它支持两种不同的 XML Schema 到 C++ 的映射:内存中 C++/Tree 和面向流的 C++/Parser。 C++/Tree 映射是具有树状内存数据结构的传统映射。 C++/Parser 是一种新的、类似 SAX 的映射,它将存储在 XML 实例文档中的信息表示为特定于词汇表的解析事件的层次结构。与 C++/Tree 相比,C++/Parser 映射允许处理不适合内存的大型 XML 文档、执行面向流的处理或使用现有的内存表示。

来源:wikipedia.org://CodeSynthesis XSD

【讨论】:

我喜欢仅使用标头的方法(我认为您确实需要一个标头文件)。把它扔进去,不用担心在你的构建过程中改变任何东西。 嗯。如果“解析器不检查字符有效性”和“解析器不检查属性唯一性”,严格来说,它不是 xml 解析器——这些不是可选的检查,由 xml 规范本身强制执行。我不会把时间浪费在这样的事情上,因为实际上也有不错的解析器(例如 libxml2)_ 这就是我使用 Rapidxml 的原因。我使用的一个系统坚持在元素名称上放置非法的尾随空格——rapidXML 是唯一可以解决这个问题的系统(诚然,没有注意到!) rapidxml 有很多实现 xml 的功能,比如 msxml 。但是节点遍历比其他解析器非常困难......还有文件读写...... 在选择用于商业用途的 XML 解析器时(在某种领域),我们需要看看解析器是否至少会维护 2 年或 3 年。与 RapidXML 相比,像 Xerces 这样的东西似乎更有可能得到支持和维护。那么 RapidXML 是一个明智的选择吗?【参考方案2】:

pugixml - 用于 C++ 的轻量级、简单和快速的 XML 解析器 非常小(与 RapidXML 相当),非常快(与 RapidXML 相当),非常易于使用(比 RapidXML 更好)。

【讨论】:

哇,这么多声明。你能备份那些吗?是什么让它在这些领域变得更好?有参考文章吗? 阅读一下 RapidXML 和 pugixml 网站我理解您(可能)的意思。 RapidXML 基于/受 pugixml 启发。它的解析文档最少。 pugixml 有很好的解析文档和漂亮的 API。 (目前只阅读有关解析的内容。) Pugixml 更容易使用,让我们从文件中读取 xml - 它只是 load_file("file.xml")!我发现它比 rapid_xml 更直观。通过 xpath 选择节点也很不错。 我已经使用 pugixml 几年了。效果很好,易于集成到项目中,文档不错。但是,无论您使用什么包,在 C++ 中编写/解析 XML 总是一件麻烦事。 @Kissaki 在商业产品中使用 [pugixml] (pugixml.org) 之前,我已经测试了一些 XML 解析器,包括一些商业解析器。【参考方案3】:

试试 TinyXML。

http://sourceforge.net/projects/tinyxml

【讨论】:

在 VC++ 和 eVC++ 上多次使用 tinyXML - 一直都很好 或使用 TinyXML 2 grinninglizard.com/tinyxml2/index.html 我正在尝试这个,出于某种原因,我从 tinyxml2 调用的类出现未解决的错误。知道为什么吗?我在包含的头文件中找到了类,所以它们应该可用。 我拒绝使用这个库(也检查了 TinyXML2),因为 - 库没有提供从 unicode 路径名加载的功能。目前我更喜欢可用性和完整的实现而不是性能。【参考方案4】:

TiCPP 是 TinyXML 的“更多 c++”版本。

'TiCPP' 是官方名称 TinyXML++ 的缩写。它是 TinyXML (http://www.grinninglizard.com/tinyxml/) 的全新接口,它使用了许多 C++ 优势。模板、异常和更好的错误处理。它在 doxygen 中也有完整的记录。这真的很酷,因为这个版本让您可以像以前一样使用微小的接口,或者您可以选择使用新的“ticpp”类。您需要做的就是定义 TIXML_USE_TICPP。它已经在 VC 6.0、VC 7.0、VC 7.1、VC 8.0、MinGW gcc 3.4.5 和 Linux GNU gcc 3+ 中进行了测试

【讨论】:

【参考方案5】:

试试这个: http://www.applied-mathematics.net/tools/xmlParser.html 它比 RapidXML 或 PUGXML 更简单、更快捷。 TinyXML 是“简单解析器”中最差的。

【讨论】:

他们做了一个更新的:applied-mathematics.net/tools/IXMLParser.html 只是一个警告,对于那些像我一样检查它的人:较新的版本有一个非常奇怪的许可证,你甚至不能在没有先发送的情况下下载它他一封电子邮件。我想我会选择 pugixml。【参考方案6】:

如果您担心效率/内存管理,请不要使用 TinyXML(它往往会分配 很多 个小块)。我个人最喜欢的是RapidXML。

【讨论】:

【参考方案7】:

gSOAP 怎么样?它是开源的,在 GPL 许可下免费提供。尽管名称如此,gSOAP 工具包是一个通用的 XML 数据绑定工具,它允许您将 C 和 C++ 数据自动绑定到 XML。无需使用 XML 解析器 API,只需让它为您读取/写入 XML 格式的数据。如果您真的需要一个超级简单的 C++ XML 解析器,那么 gSOAP 可能是一种矫枉过正。但自 2001 年引入 gSOAP 以来,它在许多工业应用中都表现良好。

以下是功能的简要列表:

便携式:Windows、Linux、Mac OS X、Unix、VxWorks、Symbian、Palm OS、WinCE 等。 占用空间小:73KB 代码和不到 2K 的数据来实现 XML Web 服务客户端应用程序(没有 DOM 来限制内存使用)。 快速:不要相信其他工具所声称的,真正的速度应该使用 I/O 来衡量。对于 gSOAP,它是超过 3000 条 TCP/IP 上的往返 XML 消息。 XML 解析开销可以忽略不计,因为它是在进行(反)序列化时对输入/输出进行简单的线性扫描。 XML 支持:XML 模式 (XSD) 导入/导出、WSDL 导入/导出、XML 命名空间、XML 规范化、带附件的 XML (MIME)、可选使用 DOM、生成带有缩进的 XML 的许多选项、使用 UTF8 字符串、等 XML 验证:部分和全部(选项) WS 支持:WS-Security、WS-ReliableMessaging、WS-Addressing、WS-Policy、WS-SecurityPolicy 等。 调试:集成内存管理与泄漏检测、日志记录。 API:无需学习 API,只需“soap”引擎上下文初始化,然后对数据使用读/写接口,以及“soap”引擎上下文销毁。

例如:

class Address
 
  std::string name;
  std::vector<LONG64> number;
  time_t date;
;

然后在上面的Address类声明上运行“soapcpp2”,生成soap_read_Addresssoap_write_Address XML读写器,例如:

Address *a = new Address();
a = ...;
soap ctx = soap_new();
soap_write_Address(ctx, a);
soap_end(ctx);
soap_free(ctx);`

这会生成Address a 对象的XML 表示。通过使用 XML 命名空间详细信息(此处未显示)注释头文件声明,这些工具还生成模式。这是一个简单的例子。 gSOAP 工具可以处理非常广泛的 C 和 C++ 数据类型,包括基于指针的链接结构甚至(循环)图(而不仅仅是树)。

希望这会有所帮助。

【讨论】:

商业用途需要一次性支付gSoap费用【参考方案8】:

TinyXML 最适合简单的 XML 工作,但如果您需要更多功能,请尝试 apache 项目中的 Xerces。转到以下页面以了解有关其功能的更多信息。

http://xerces.apache.org/xerces-c/

【讨论】:

Xerces 有哪些 TinyXML 没有的功能? 好的,更重要的是TinyXML没有哪些功能? 它实现了整个 DOM。 TinyXML 更简单,但足以将数据保存在 XML 中。 Xerces 实现了整个 xml 标准。 TinyXML 实现了足够有用。事实证明,99% 或用户只会使用 1% 的 XML 标准,所以 TinyXML 通常就足够了。【参考方案9】:

TinyXML,还有 Boost.PropertyTree。后者不满足所有官方要求,但非常简单。

【讨论】:

Boost.PropertyTree 非常适合我这种简单的数据存储。 This is the page 明确了如何使用它。哇,我喜欢提升。 Boost PropertyTree 不是那么有用,除非在琐碎的 XML 文件中。该结构没有反向链接,因此到达节点的父节点意味着您确实需要在 Property Tree 读取 XML 后滚动自己的数据结构来存储 XML。而且它没有对 xpath 特性的查询支持。您所能做的就是将 XML 文件读入树形结构,如果您知道确切的路径,则直接提取一个值。 我也喜欢 boost::property_tree。 how to parse XML and JSON 有一些实用的 Visual Studio 实现 boost::property_tree 非常臃肿(增加编译时间和可执行文件大小)并且似乎不再维护。不推荐。 我拒绝使用这个库(也检查了 TinyXML2),因为 - 库没有提供从 unicode 路径名加载的功能。目前我更喜欢可用性和完整的实现而不是性能。【参考方案10】:

我是 C++ 新手,在此页面上尝试了几个不同的建议后,我必须说我最喜欢 pugixml。它具有易于理解的文档和高级 API,这正是我所寻找的。​​p>

【讨论】:

【参考方案11】:

我喜欢 Gnome xml 解析器。它是开源的(MIT 许可,因此您可以在商业产品中使用它)、速度快并且具有基于 DOM 和 SAX 的接口。

http://xmlsoft.org/

【讨论】:

您碰巧在使用 CodeBlocks?我试图让 c++ 包装器启动并运行它,它让我很适合。【参考方案12】:

试试TinyXML 或IrrXML...它们都是轻量级的XML 解析器(无论如何我建议你使用TinyXML)。

【讨论】:

以上是关于什么是 C++ 的最佳开放 XML 解析器? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Android:解析 XML 数据的最佳解析器 [关闭]

用于操作/编辑现有 xml 文档的最佳 java Xml 解析器

在 C# 代码中解析(大)XML 的最佳方法是啥?

解析器与词法分析器和 XML

TinyXML:一个优秀的C++ XML解析器

C++使用TinyXml(开源库)读取*.XMl文件