C++ 我应该在C+;中使用什么XML解析器+;?
我有需要解析和/或构建XML文档并将其写入文本(文件或内存)的XML文档。因为C++标准库没有这个库,我应该用什么?C++ 我应该在C+;中使用什么XML解析器+;?,c++,xml-parsing,c++-faq,C++,Xml Parsing,C++ Faq,我有需要解析和/或构建XML文档并将其写入文本(文件或内存)的XML文档。因为C++标准库没有这个库,我应该用什么? 注意:这是一个明确的、C++-FAQ风格的问题。所以是的,它是其他的复制品。我并不是简单地将这些问题恰当化,因为它们往往要求更具体一点的问题。这个问题更一般。就像标准库容器一样,您应该使用什么库取决于您的需要。以下是一个方便的流程图: 所以第一个问题是:你需要什么? 我需要完全遵守XML 好的,所以您需要处理XML。不是玩具XML,而是真正的XML。您需要能够读取和写入所有XM
注意:这是一个明确的、C++-FAQ风格的问题。所以是的,它是其他的复制品。我并不是简单地将这些问题恰当化,因为它们往往要求更具体一点的问题。这个问题更一般。就像标准库容器一样,您应该使用什么库取决于您的需要。以下是一个方便的流程图: 所以第一个问题是:你需要什么? 我需要完全遵守XML 好的,所以您需要处理XML。不是玩具XML,而是真正的XML。您需要能够读取和写入所有XML规范,而不仅仅是低劣、易于解析的位。您需要名称空间、doctype、实体替换等。W3CXML规范的全部内容 下一个问题是:您的API需要符合DOM或SAX吗? 我需要确切的DOM和/或SAX一致性 好的,那么您真的需要API是DOM和/或SAX。它不能只是SAX风格的推式解析器,也不能是DOM风格的保留式解析器。它必须是实际的DOM或实际的SAX,在C++允许的范围内。 您选择了: 那是你的选择。它是唯一的C++(XML)解析器/写入器,它具有完全(或接近C++允许)DOM和SAX一致性。它还具有XInclude支持、XML模式支持和大量其他特性 它没有真正的依赖关系。它使用Apache许可证 我不关心DOM和/或SAX的一致性 您选择了: LibXML2提供了一个C风格的接口(如果这真的让您感到困扰,可以使用Xerces),尽管该接口至少有点基于对象,并且易于包装。它提供了很多特性,比如XInclude支持(通过回调,您可以告诉它从哪里获取文件)、XPath 1.0识别器、RelaxNG和Schematron支持(尽管错误消息还有很多需要改进的地方),等等 它确实依赖于iconv,但可以在没有该依赖的情况下进行配置。尽管这确实意味着它可以解析的可能文本编码集将更加有限 它使用MIT许可证 我不需要完全遵从XML 好的,所以完全遵守XML对您来说并不重要。您的XML文档要么完全在您的控制之下,要么保证使用XML的“基本子集”:没有名称空间、实体等 那对你有什么关系?下一个问题是:在XML工作中,对您来说最重要的是什么? 最大XML解析性能 应用程序需要将XML转换为C++数据结构,因为这种转换可能会发生。 您选择了: 这个XML解析器正是它在tin上所说的:rapid XML。它甚至不处理将文件拉入内存的问题;如何做到这一点取决于你。它处理的是将它解析成一系列可以访问的C++数据结构。它的速度和逐字节扫描文件的速度差不多 当然,没有免费的午餐。与大多数不关心XML规范的XML解析器一样,Rapid XML不涉及名称空间、文档类型、实体(字符实体和6个基本XML实体除外)等等。基本上是节点、元素、属性等等 此外,它还是一个DOM风格的解析器。所以它确实要求你阅读所有的文本。但是,它不会复制任何文本(通常)。RapidXML获得最大速度的方法是通过引用适当的字符串。这需要更多的内存管理(在RapidXML查看该字符串时,必须使该字符串保持活动状态) RapidXML的DOM是赤裸裸的。您可以获取事物的字符串值。可以按名称搜索属性。就这样。没有方便的函数将属性转换为其他值(数字、日期等)。你只是得到了一些线索 RapidXML的另一个缺点是编写XML很痛苦。为了构建其DOM,需要对字符串名进行大量显式内存分配。它确实提供了一种字符串缓冲区,但这仍然需要在您的终端上进行大量显式工作。它当然是功能性的,但使用起来很痛苦 它使用麻省理工学院的许可证。它是一个只有标题的库,没有依赖项
- 有一种方法允许它也使用名称空间
rapidxml::xml_document<char> doc;
doc.parse<0>(xmlData);
rapidxml::xml_node<char>* root = doc.first_node();
rapidxml::xml_node<char>* node_account = 0;
if (GetNodeByElementName(root, "Account", &node_account) == true)
{
rapidxml::xml_node<char>* node_default = 0;
if (GetNodeByElementName(node_account, "default", &node_default) == true)
{
swprintf(result, 100, L"%hs", node_default->value());
free(xmlData);
return true;
}
}
free(xmlData);