我知道已经提出了很多c / c ++ XML库问题(在尝试之前我试图通读所有这些问题)。
以下是我在自己的项目中需要的东西:
我打算使用Xerces-C,但我发现在过滤器中没有任何操作的简单SAX2设置需要5秒才能运行。 (也许我在这里做错了什么?)
我想使用libxml ++,但是当我试图在我的MacBook上设置它时,有一些疯狂的依赖关系让我一直回到gtk-doc,此时我提出了这个想法。
所以现在我在libxml2。这是要走的路吗?我是否错过了一个重要的选项,同时考虑到上述五项要求?我不介意使用像libxml2这样的(好的)c库,但是c ++接口会很好。 (我不太喜欢Xerces-C的API。)
如果可以获得类似的功能,我愿意屈服于SAX2的要求。
花了相当多的时间在同一个问题上,我的结论是libxml2是您指南下可用的最佳选择。 C接口使用起来并不太难,而且速度非常快。
商业图书馆还有其他一些不错的选择,但大多数其他可比较的开源选项要么非常缓慢,要么陷入深深的,恼人的依赖汤中。
你说你在项目中需要这些东西,但是不要对管道有所了解。例如,我们有一大堆静态XML文件,需要快速加载,但很少得到验证。因此使用批处理中的单独进程进行验证(使用RelaxNG,因为它是人类可写标记)并使用expat加载XML。系统还使用了XMPP,因此检查了流输入,但这不需要针对模式进行验证(部分原因是它是流式传输的,主要是因为大多数可能的错误在模式中无法表达)。
我已经创建了一个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模式验证。
谢谢。