2009-10-11 60 views
0

我知道很多c/C++ XML库问题已经被问到(我试图在读完之前通读所有问题)。c/C++ XML库问题

这里是我会在我自己的项目所需要的东西:

  • 卓越的性能
  • SAX2
  • 验证
  • 开源
  • 跨平台

我打算使用Xerces-C,但是我看到一个简单的SAX2 s在过滤器中没有任何东西需要运行5秒钟。 (也许我在这里做错了什么?)

我想使用libxml ++,但正如我试图让它在我的MacBook上设置,有一些疯狂的依赖,带我回到gtk- doc,我在这一点上提出了这个想法。

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

如果可比较的功能可用,我愿意在SAX2要求上下功夫。

+0

我也愿意使用一个单独的验证库,如果是简单的构造这样的DOM;即一个用于SAX2的库,另一个用于验证。但是设置不应该太笨拙。 – 2009-10-11 04:56:43

回答

2

在这个问题上花费了大量的时间,这是我的结论,libxml2是您的指导下最好的选择。 C界面不太难使用,速度非常快。

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

+1

前三大商业选择是什么?什么是取舍? – 2009-10-11 05:06:56

0

如果你需要一大堆其他设施,你可以考虑Qt,它有很好的XML支持。不过要注意的是,它不仅仅是一个XML处理库。它是一个全面的应用程序框架,支持图形用户界面,网络和其他一系列事物。

Qt

您也可以尝试波科。这是另一种应用程序框架,但不作为的Qt作为巨大的(即没有GUI相关的东西等)

Poco

最后,如果你不介意一个C库,你可以使用外籍人士。这本身不是SAX,但使用Expat编写代码有点像SAX。它有C++包装器,但它们并不是IIRC项目的正式组成部分,可能不是很好维护或设计的。但我不太确定。

Expat

希望这有助于!

编辑:我误解了你原来的文章:不太确定这些库的验证功能,我以前从未使用过它们。

+1

我看着Qt并留下了深刻的印象。验证尚未推出(截至2月),但也许我应该仔细观察。 IIRC,Expat和Poco都不提供验证,但否则它们看起来不错。 – 2009-10-11 04:53:31

1

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

+0

管道是一个很好的点。我不需要在同一个应用程序中使用SAX和验证。我想使用一个通用框架,其中一个应用程序将对小文件进行DOM解析,另一个将处理非常大的文件。如果有可用的话,我只想要一个通用框架。我会检查你提到的东西。 – 2009-10-11 17:18:53

0

我创建了一个C++ 11 XML解析库库(Java的的StAX等)加速许可证。你可以在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> 

而对于像结构的读取代码:

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

一个完整的例子可以发现

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

甲读取(解串行化代码)功能at 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类似的解析器不同, ,libxml2 IO是一个C++库,它也不是基于回调的。 与apache xerces异常不同,rtti可以同时关闭。 与TinyXML的,POCO等没有DOM支持

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

谢谢你。