Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该在C+;中使用什么XML解析器+;?_C++_Xml Parsing_C++ Faq - Fatal编程技术网

C++ 我应该在C+;中使用什么XML解析器+;?

C++ 我应该在C+;中使用什么XML解析器+;?,c++,xml-parsing,c++-faq,C++,Xml Parsing,C++ Faq,我有需要解析和/或构建XML文档并将其写入文本(文件或内存)的XML文档。因为C++标准库没有这个库,我应该用什么? 注意:这是一个明确的、C++-FAQ风格的问题。所以是的,它是其他的复制品。我并不是简单地将这些问题恰当化,因为它们往往要求更具体一点的问题。这个问题更一般。就像标准库容器一样,您应该使用什么库取决于您的需要。以下是一个方便的流程图: 所以第一个问题是:你需要什么? 我需要完全遵守XML 好的,所以您需要处理XML。不是玩具XML,而是真正的XML。您需要能够读取和写入所有XM

我有需要解析和/或构建XML文档并将其写入文本(文件或内存)的XML文档。因为C++标准库没有这个库,我应该用什么?


注意:这是一个明确的、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,需要对字符串名进行大量显式内存分配。它确实提供了一种字符串缓冲区,但这仍然需要在您的终端上进行大量显式工作。它当然是功能性的,但使用起来很痛苦

它使用麻省理工学院的许可证。它是一个只有标题的库,没有依赖项

  • 有一种方法允许它也使用名称空间
我关心性能,但不太在意 是的,性能对你很重要。但也许你需要一些不那么赤裸裸的东西。也许可以处理更多的Unicode,或者不需要那么多用户控制的内存管理。性能仍然很重要,但您需要一些不那么直接的东西

您选择了:

从历史上看,这是RapidXML的灵感来源。但这两个项目存在分歧,Pugi提供了更多功能,而RapidXML则完全专注于速度

PugiXML提供Unicode转换支持,因此如果您有一些UTF-16文档,并且希望将它们作为UTF-8读取,Pugi将提供。如果需要的话,它甚至有一个XPath1.0实现

但普吉仍然相当快。与RapidXML一样,它没有依赖项,并且是根据MIT许可证分发的

阅读大量文件 您需要读取以GB为单位的文档。也许你是从stdin那里得到的,被其他的过程喂养。或者你正在从大量文件中读取它们。或者别的什么。关键是,您需要的是不必一次将整个文件读入内存来处理它

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