I am looking for a simple, clean, correct XML parser to use in my C++ project. Should I write my own?
12 回答
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 规范。
- 解析器不检查属性唯一性。
根据您的使用情况,您可能会使用 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 文档、执行面向流的处理或使用现有的内存中表示。
pugixml - 用于 C++ 的轻量级、简单和快速的 XML 解析器非常小(与 RapidXML 相当),非常快(与 RapidXML 相当),非常易于使用(比 RapidXML更好)。
Try 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 可能是一个矫枉过正的选择。但对于其他所有方面,自 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”,生成Address
XML读写器,例如:soap_read_Address
soap_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++ 数据类型,包括基于指针的链接结构甚至(循环)图(而不仅仅是树)。
希望这可以帮助。
TinyXML 最适合简单的 XML 工作,但如果您需要更多功能,请尝试 apache 项目中的 Xerces。转到下一页以了解有关其功能的更多信息。
我是 C++新手,在此页面上尝试了几个不同的建议后,我必须说我最喜欢pugixml。它具有易于理解的文档和我一直在寻找的高级 API。
TinyXML,还有 Boost.PropertyTree。后者不满足所有官方要求,但非常简单。
我喜欢 Gnome xml 解析器。它是开源的(MIT 许可证,因此您可以在商业产品中使用它)、速度快并且具有基于 DOM 和 SAX 的接口。