什么是C++最好的开放XML解析器?

wha*_*awg 241 c++ xml open-source

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

jk.*_*jk. 119

RapidXML怎么?RapidXML是一个用C++编写的非常快速且小巧的XML DOM解析器.它主要针对嵌入式环境,计算机游戏或任何其他可用内存或CPU处理能力非常高的应用程序.RapidXML根据Boost软件许可证授权,其源代码可免费获得.

特征

  • 解析速度(包括DOM树构建)接近在相同数据上执行的strlen函数的速度.
  • 在现代CPU上(截至2008年),解析器吞吐量约为每秒10亿个字符.请参阅在线手册中的性能部分.
  • 代码的小内存占用和创建的DOM树.
  • 仅限标头的实现,简化了集成过程.
  • 简单许可,允许用于几乎任何商业和非商业目的,没有任何义务.
  • 支持UTF-8和部分UTF-16,UTF-32编码.
  • 可移植源代码,除了C++标准库的一小部分外,没有依赖关系.
  • 该子集非常小,如果不希望使用标准库,则可以轻松地手动模拟.

限制

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

来源:wikipedia.org : //Rapidxml


根据您的使用情况,您可以使用XML数据绑定?CodeSynthesis XSD是一个用于C++的XML数据绑定编译器,由Code Synthesis开发,并在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

  • 我喜欢仅限标题的方法(我认为你真的需要一个头文件).只需将其扔进去,不要担心在构建过程中更改任何内容. (7认同)
  • Hmmh.如果"解析器不检查字符有效性"和"解析器不检查属性唯一性",严格来说,它不是xml解析器 - 这些不是可选的检查,由xml规范本身强制执行.我不会浪费我的时间在这样的事情上,因为也有实际的好的解析器(例如libxml2)_ (6认同)
  • 这就是我使用Rapidxml的原因.我工作的一个系统坚持在元素名称上放置非法的尾随空格 - rapidXML是唯一能够应对这种情况的人(诚然没有注意到!) (3认同)

Zby*_*byl 99

pugixml - 用于C++的轻量级,简单快速的XML解析器非常小(与RapidXML相当),非常快(与RapidXML相当),非常易于使用(优于 RapidXML).

  • 哇,这是很多说法.你可以支持吗?是什么让这些领域变得更好?有参考文章吗? (23认同)
  • 在RapidXML以及pugixml网站上阅读一下我理解你(可能)的意思.RapidXML基于/ pugixml的灵感.它有很少的解析文档.pugixml有很好的解析和漂亮的API文档.(到目前为止只阅读解析.) (4认同)
  • @Kissaki在商业产品中使用[pugixml](http://pugixml.org/)之前,我已经测试了一些XML解析器,包括一些商业解析器。 (2认同)

Rob*_*Rob 41

试试TinyXML.

http://sourceforge.net/projects/tinyxml

  • 或使用TinyXML 2 http://www.grinninglizard.com/tinyxml2/index.html (3认同)
  • 在VC++和eVC++上多次使用tinyXML - 总是运行良好 (2认同)

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


小智 14

尝试这个:http: //www.applied-mathematics.net/tools/xmlParser.html
它比RapidXML或PUGXML更容易,更快.
TinyXML是"简单解析器"中最糟糕的.

  • 但是,对于那些正在检查我的人来说只是一个警告:*更新的*版本有一个非常奇怪的许可证,你甚至无法在没有给他发送电子邮件的情况下下载它.我想我会选择pugixml. (3认同)

yrp*_*yrp 12

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


小智 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,它通过TCP/IP传输超过3000条往返XML消息.XML解析开销可以忽略不计,因为它是(de)序列化发生时输入/输出的简单线性扫描.
  • 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"引擎上下文初始化,然后使用读/写接口为您的数据,以及"肥皂"引擎上下文破坏.

例如:

class Address
{ 
  std::string name;
  std::vector<LONG64> number;
  time_t date;
};
Run Code Online (Sandbox Code Playgroud)

然后在Address上面的类声明上运行"soapcpp2" 以生成soap_read_Addresssoap_write_AddressXML读取器和编写器,例如:

Address *a = new Address();
a = ...;
soap ctx = soap_new();
soap_write_Address(ctx, a);
soap_end(ctx);
soap_free(ctx);`
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助.

  • 对于商业用途,您必须为gSoap支付一次性费用 (3认同)

Ram*_*der 9

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

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

  • Xerces表示ENTIRe xml标准.TinyXML的实际应用非常有用.事实证明,99%或者用户只会使用1%的XML标准,因此TinyXML通常就足够了. (4认同)

god*_*bow 9

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


Lev*_*Lev 8

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

  • `Boost.PropertyTree`非常适合我的简单数据存储.[这是页面](http://www.boost.org/doc/libs/1_42_0/doc/html/boost_propertytree/tutorial.html),明确了如何使用它.哇,我喜欢提升. (2认同)

dic*_*oce 7

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

http://xmlsoft.org/