250

I am looking for a simple, clean, correct XML parser to use in my C++ project. Should I write my own?

4

12 回答 12

122

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

于 2008-10-04T19:49:20.970 回答
109

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

于 2010-08-01T03:27:40.743 回答
42

Try TinyXML.

http://sourceforge.net/projects/tinyxml

于 2008-10-04T17:22:55.897 回答
16

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+ 中进行了测试

于 2008-10-04T18:27:22.040 回答
14

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

于 2010-08-18T09:55:15.687 回答
12

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

于 2008-10-04T19:48:09.303 回答
10

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;
};

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

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++ 数据类型,包括基于指针的链接结构甚至(循环)图(而不仅仅是树)。

希望这可以帮助。

于 2010-05-12T19:23:11.380 回答
9

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

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

于 2008-10-04T17:30:15.960 回答
9

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

于 2010-09-09T11:45:13.633 回答
9

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

于 2008-10-04T18:49:23.493 回答
7

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

http://xmlsoft.org/

于 2008-10-04T17:59:51.347 回答
2

Try TinyXML or IrrXML...Both are lightweight XML parsers ( I'd suggest you to use TinyXML, anyway ).

于 2008-10-04T17:27:05.453 回答