我创建了一个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模式验证尚未完成。
谢谢你。
我也愿意使用一个单独的验证库,如果是简单的构造这样的DOM;即一个用于SAX2的库,另一个用于验证。但是设置不应该太笨拙。 – 2009-10-11 04:56:43