c / c ++ XML库问题

问题描述 投票:0回答:4

我知道已经提出了很多c / c ++ XML库问题(在尝试之前我试图通读所有这些问题)。

以下是我在自己的项目中需要的东西:

  • 完美的表现
  • SAX2
  • 验证
  • 开源
  • 跨平台

我打算使用Xerces-C,但我发现在过滤器中没有任何操作的简单SAX2设置需要5秒才能运行。 (也许我在这里做错了什么?)

我想使用libxml ++,但是当我试图在我的MacBook上设置它时,有一些疯狂的依赖关系让我一直回到gtk-doc,此时我提出了这个想法。

所以现在我在libxml2。这是要走的路吗?我是否错过了一个重要的选项,同时考虑到上述五项要求?我不介意使用像libxml2这样的(好的)c库,但是c ++接口会很好。 (我不太喜欢Xerces-C的API。)

如果可以获得类似的功能,我愿意屈服于SAX2的要求。

c++ xml
4个回答
2
投票

花了相当多的时间在同一个问题上,我的结论是libxml2是您指南下可用的最佳选择。 C接口使用起来并不太难,而且速度非常快。

商业图书馆还有其他一些不错的选择,但大多数其他可比较的开源选项要么非常缓慢,要么陷入深深的,恼人的依赖汤中。


1
投票

你说你在项目中需要这些东西,但是不要对管道有所了解。例如,我们有一大堆静态XML文件,需要快速加载,但很少得到验证。因此使用批处理中的单独进程进行验证(使用RelaxNG,因为它是人类可写标记)并使用expat加载XML。系统还使用了XMPP,因此检查了流输入,但这不需要针对模式进行验证(部分原因是它是流式传输的,主要是因为大多数可能的错误在模式中无法表达)。


0
投票

如果您需要大量其他工具,可以考虑Qt,它具有良好的XML支持。但要注意,它不仅仅是一个XML处理库;它是一个完整的应用程序框架,支持GUI,网络和许多其他东西。

Qt

你也可以试试Poco。它是另一个应用程序框架,但没有Qt那么大(即没有与GUI相关的东西等)

Poco

最后,如果您不介意使用C库,则可以使用Expat。它本身不是SAX,但使用Expat编写代码有点像SAX。它有C ++包装器,但它们不是正式的IIRC项目的一部分,并且可能没有良好的维护或设计。我不太确定。

Expat

希望这可以帮助!

编辑:我误读了您的原始帖子:不太确定这些库的验证功能,我以前从未使用过它们。


0
投票

我已经创建了一个C ++ 11 XML池解析库(类似Java StAX)Boost许可证。你可以在https://github.com/incoder1/IO找到它。

将XML读入POCO结构的示例。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<configurations>
    <configuration id="0" enabled="true">
        <name>Test configuration <![CDATA[<0>]]></name>
    </configuration>
    <configuration id="1" enabled="false">
        <name>Test configuration <![CDATA[<1>]]></name>
    </configuration>
</configurations>

和结构的阅读代码如:

/// A structure to parse into
struct configuration
{
    std::size_t id;
    bool enabled;
    std::string name;
};

读取(反序列化代码)功能

static configuration read_config(io::unsafe<io::xml::reader>& rd) {
    configuration ret;
    io::xml::start_element_event bev = rd.next_tag_begin();
        // read id from attribute
        io::const_string tmp = bev.get_attribute("id").first;
        ret.id = size_t_cast::from_string( tmp.data() );
        tmp = bev.get_attribute("enabled").first;
        ret.enabled = bool_cast::from_string( tmp.data() );
        // read name value from tag
        bev = rd.next_tag_begin();
          ret.name = std::string( rd.next_characters().data() );
        rd.next_tag_end();
    // goto </configuration>
    rd.next_tag_end();
    return ret;
}

一个完整的例子可以在https://github.com/incoder1/IO/tree/master/examples/xml_read找到

更复杂的Java StAX示例(如事件库)XML解析器可在以下位置找到:https://github.com/incoder1/IO/tree/master/examples/xmlparse

库需要一个iconv(POSIX / Unix就像操作系统,例如GNU / Linux,FreeBSD,MacOSX将它捆绑到libc中)和gnutls。 GnuTLS用于最小的网络支持,可以避免XML解析。在Windows(Windows 7,Windows 10)和GNU / Linux(Fedora 23,Fedora 26)上使用GCC 5+(GNU / Linux和MinGW64)和MS VC ++ 15 +进行了库测试

与C SAX类似,解析器expact,libxml2 IO是一个C ++库,它也不是基于回调的。与apache xerces异常不同,rtti可以同时关闭。与TinyXML,POCO等不同,没有DOM支持

Parser仅验证XML语法。尚未完成XSD或DTD上的XML模式验证。

谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.