什么是C ++的最佳开放XML解析器?
我正在寻找一个简单,干净,正确的XML解析器在我的C ++项目中使用。 我应该写我自己的?
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是由Code Synthesis开发的用于C ++的XML数据绑定编译器,在GNU GPL和专有许可下获得双重许可。 给定一个XML实例规范(XML Schema),它生成代表给定词汇以及解析和序列化代码的C ++类。
CodeSynthesis XSD的独特功能之一是支持两种不同的XML Schema to C ++映射:内存中的C ++ / Tree和面向流的C ++ / Parser。 C ++ / Tree映射是具有树状内存数据结构的传统映射。 C ++ / Parser是一种新的类SAX映射,它将存储在XML实例文档中的信息表示为特定于词汇表的解析事件的层次结构。 与C ++ / Tree相比,C ++ / Parser映射允许处理不适合内存的大型XML文档,执行面向流的处理或使用现有的内存中表示。
来源: wikipedia.org : CodeSynthesis XSD
pugixml – 用于C ++的轻量级,简单快速的XML解析器非常小(与RapidXML相比),非常快(与RapidXML相比),非常易于使用(比RapidXML 更好 )。
试试TinyXML。
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+
试试这个: http : //www.applied-mathematics.net/tools/xmlParser.html
它比RapidXML或PUGXML更简单快捷。
TinyXML是“简单的解析器”中最糟糕的。
如果你关心效率/内存管理(它倾向于分配大量的小块),不要使用TinyXML。 我个人最喜欢的是RapidXML 。
gSOAP呢? 它是开源的,可以在GPL许可下免费获得。 尽管它的名字,gSOAP工具包是一个通用的XML数据绑定工具,并允许您自动将您的C和C ++数据绑定到XML。 不需要使用XML解析器API,只需让它以XML格式读取/写入数据即可。 如果你真的需要一个超级简单的C ++ XML解析器,那么gSOAP可能是一个矫枉过正的问题。 但自从gSOAP在2001年推出以来,其他所有方面的表现都很好,因为许多工业应用都有这样的评价。
这里是一个简要的功能列表:
- 便携式: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; };
然后在上面的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 ++数据类型,包括基于指针的链接结构和甚至(循环)图形(而不仅仅是树)。
希望这可以帮助。
TinyXML对于简单的XML工作来说可能是最好的,但是如果你需要更多的功能,那么就试试apache项目中的Xerces。 转到下一页阅读更多关于它的功能。
我是一个C ++ 新手 ,在尝试了几个不同的建议后,我必须说我最喜欢pugixml 。 它很容易理解的文档和一个高层次的API,这是我一直在寻找。
我喜欢Gnome xml解析器。 它是开源的(MIT许可证,所以你可以在商业产品中使用它),速度快,并且有基于DOM和SAX的接口。
TinyXML,还有Boost.PropertyTree。 后者并不符合所有的官方要求,但非常简单。
尝试TinyXML或IrrXML …都是轻量级的XML解析器(无论如何,我建议你使用TinyXML)。