我創建了一個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