什么是 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_Address
和soap_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 解析器? [复制]的主要内容,如果未能解决你的问题,请参考以下文章