在C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比较著名的大型库。
1、Xerces
参考网站:http://xml.apache.org/xerces-c/
Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAX和DOM API。XML验证在文档类型定义(Document Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XMLSchema 的基本完整的开放标准。
2、XMLBooster
参考网站:http://www.xmlbooster.com/
这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序来修改这个parser。在DOM和SAX两大主流XML解析办法之外提供了另外一个可行的解决方案。
3、Pull Parser
参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp
这个库采用pull方法的parser。在每个SAX的parser底层都有一个pull的parser,这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。
4、Xalan
参考网站:http://xml.apache.org/xalan-c/
Xalan是一个用于把XML文档转换为HTML,纯文本或者其他XML类型文档的XSLT处理器。
5、CMarkup
参考网站:http://www.firstobject.com/xml.htm
这个只能算是半开源的。网上能下载到的CMarkup源代码,绝大多数是CMarkup 付费版的阉割版本。当然,免费版已经能满足基本的读需求,对于写需求则不能很好满足。我只评论免费版。
CMarkup采用EDOM模型,容错性不错。可以读根节点多于一个的“非法xml文档”(xml文档根节点只有一个),例如下面的文档,CMarkup就可以处理。
CMarkup是"只进式" 的 。在我看来,CMarkup免费版的优点就是读效率很好,当然这是以增加用户出错几率为代价的。还以上面的文档为例,当CMarkup::FindElem("B")后,在CMarkup::FindElem("A"),就找不到了,只有CMarkup::Reset后才能找到。
尽管CMarkup提供了IntoElem,OutOfElem来导航,使用户可以在父、子节点间切换,但是如果用户忘了OutOfElem呢?如果真是这样,错误将不幸发生。
CMarkup免费版也不能移除节点的属性,而且在添加新节点时有一半的几率出错,也就是要么重新从根节点开始生成xml文档,要么就不要在现有xml文档中添加节点。
6、libxml++
参考网站:http://libxmlplusplus.sourceforge.net/
libxml++是对著名的libxml XML解析器的C++封装版本。
7. TinyXML [wangxinus注:一个非常小巧的XML解析库,基于DOM的。]
采用DOM模型。
注意,TinyXml2不是TinyXml的升级版,两个是不同的xml库。TinyXml2和TinyXml同根生,只是TinyXml2更快效率更高(这以牺牲TinyXml的一部分功能为代价)
使用TinyXml或TinyXml2,只需要注意 TiXmlDocument实例的资源释放就行,其他的资源TiXmlDocument代为管理。
不支持多个根节点的xml文档解析。不支持宽字符串的xml文档解析。也就是说,使用TinyXml或TinyXml2要做好随时在wchar_t 和char切换的心里准备。
8. pugiXml
pugixml的官方主页为:http://pugixml.org/
采用DOM模型。有兴趣的可搜索pugxml(不是pugixml)。
pugiXml可以解析多个根节点的xml文档,这一点和CMarkup是一样的。
pugiXml支持宽字符串,只要打开PUGIXML_WCHAR_MODE宏就可以。 而且,pugiXml使用了命名空间,所以可以方便的生成两份xml库,一份支持char,一份支持wchar_t
pugiXml的接口设计也很人性化,简洁、高效,望文生义。
值得称赞的是,pugiXml还支持XPath。再次感谢Arseny Kapoulkine。