开放源码前三名
三种最流行的开放源码 XML 库是 expat、libxml 和 Xerces。这三者都是跨平台的,每一种都充当 XSLT 库实现的基础,一旦满足了基本 XML 需要之后,它就会给您一条成长途径。
* expat 是 James Clark 创始的开放源码面向事件的 XML 解析库。他已经将该项目转让给了 SourceForge 中的一个小组。有一个 SAX 封装器可供使用。在许多项目中都可以找到 expat 解析器,如开放源码浏览器 Mozilla、XSLT 处理器 Transformiix 和 RDF 工具 repat。
* libxml 为类似于 SAX 和 DOM 的操作提供了双重方式 API。它支持对 DTD 的验证,并且在 Gnome 的 XSLT 处理器 libxslt中使用。libxml 经过重写,已作为 libxml(2) 发布,也许还称为 libxml2。这个库的用户应该确保他们拥有了当前版本。
* Xerces 是非常坚固的、拥有大量文档的库,它充当 IBM alphaWorks XML4C 库的基础。Xerces 还用于 Apache XSLT 处理器 Xalan 中。Xerces 支持 DOM、SAX,以及对 DTD 的验证。最新版本读取并解释了部分“W3C XML 模式推荐”(打算到 2001 年底实现完整的 XML 模式支持)。
将这三种最流行的库其中一种编译并链接到您的项目毫不费力。大多数软件包都包括了每个平台的详尽说明。这里是一些样本安装说明。
在 Windows 上构建开放源码库
在 Windows 上从头构建 libxml是很简单的四个步骤:
1. 下载源 tarball 文件。
2. 使用诸如 Winzip 之类的程序将内容解压缩到一个目录中。请确认指示了解压缩实用程序保留 libxml可能需要的任何子目录的路径名。
3. 定位 ./win32/dsp 子文件夹中的 libxml2.dsw 文件,并从 MS Developer Studio 中打开它。
4. 从 DevStudio 中的顶部菜单选择 Build All。这将构建所有样本和测试程序,以及运行它们所需的 libxml DLL。
可以使用上述步骤在 Windows 上构建 Xerces。唯一的区别就是查找 ./c/samples/Projects/Win32/VC6 子文件夹中的 samples.dsw 工作空间文件。
expat 已经开始包括了 DSP 项目 makefile。请查看 lib 和 xmlwf 子文件夹。
推荐投诉
各类库比较分析:
1 Xerces
JDOM JDOM是一种面向Java的读、写和操作XML文档的API。JDOM 与现行的SAX 和DOM标准兼容,为Java 程序员提供了一个简单、轻量的XML文档操作方法。由于JDOM是专门为Java 程序员开发的,所以采用许多Java语言的优秀特性,比如方法重载、集合(Collections)和类映射(Reflection)。
dom4j Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
XOM XOM虽然也是一种面向对象的XML API,类似于DOM 的风格,但是它有一些与众不同的特性比如严格保持内存中对象的不变性,从而使XOM实例总是能序列化为正确的XML。此外,与其他Java XML API相比,XOM 追求更简单和更正规。
JiBX JiBX是一个为Java提供的XML数据绑定框架。它可以和现存的类一起运行,使用一个灵活的映射定义文件来决定如何将数据对象转换成XML。
KXML KXML是一个只占很小存储空间的XML语法分析程序,对于J2ME应用程序非常适合。它有一个非常独特的DOM操作方法和被称为Pull的语法分析方法。它有以下性能:
· 支持XML名称空间
· 用"松散"模式分析HTML或其它SGML格式
· 占用很少的存储空间(21 kbps)
· 基于Pull的分析
· 支持XML写操作
· 可选的DOM支持
· 可选的WAP支持
XMLBeans XMLBeans是一个XML-Java绑定工具,利用它可以很方便地解析XML文档。Eclipse支持插件:xmlbeansplug(在线更新地址)。
jConfig 因为properties的局限性,有时候得使用XML文件来定义应用的配置参数,jConfig 正是这样一个读写XML配置文件的工具。开发者在 Java 程序中只需要使用get/set方法就能读取修改 XML 文件中的配置参数。jConfig 目前只支持两层结构,最新版本为 2.3。
XStream XStream使用起来非常简单,不需要预先生成相关的辅助类,不需要映射文件。当然,使用简单也注定了它只能处理简单结构的 XML 文件。
XJR 一个XML的Java绑定框架,它的主要特点是不需要映射文件,用XJRDTDCompiler直接通过DTD文件生成Java文件,也可以用 XJRDTDCreator对Java类处理生成DTD文件。当然也有不足,就是还不支持Schema。
Piccolo XML Parser Piccolo是利用java快速解析XML文档的开源项目。它实现 SAX 1, SAX 2.0.1, and JAXP 1.1 接口作为一个(Non-validating)非验证剖析器。
NanoXML NanoXML是一个能在CLDC 环境下运行的开放源代码非确认性(不做验证工作直接进行解析)的XML 分析器。Nanoxml是一步解析器(非常小6KB的XML解析器),一次就把文档解析完并以一个树状的结构传回。
XP Parser XP是一个Java开发的XML1.0解析器.它当前是一个非验证解析器,然而它可以解析所有外部实休:外部DTD子集,外部参数实体,普通的外部实体.
Commons-Digester Digester基于规则的XML文档解析,主要用于XML到Java对象的映射.
NunniMJAX NunniMJAX是一个Java非验证XML解析器。它的APIs与功能类似于SAX.这意味着你如果熟悉SAX你将很容易掌握这个解析器。
Crimson Crimson是一个基于Java的XML解析器.它通过JAXP1.1,SAX2.0,SAX2扩展版本1.0,DOM Level 2 Core Recommendation来支持XML1.0.
JOX JOX是一组Java类库,它使得在XML文档与Java Beans之间进行数据转换变得容易.你可以把JOX想象成Java对象序列化(Java Object Serialization)的一个种特殊形式,利用XML作为序列化的格式.
JaxMe JaxMe是对JAXB(Java/XML绑定规范)的一种开放源代码实现。它对基本的JAXB 规范作了一些改进之外并且集成了数据库和Enterprise JavaBeans.
XMLConfigReader XMLConfigReader是对Java ResourceBundle类的一个开源扩展.利用它可以直接从XML文件中读取配置数据并把数据存储在一个HashTable中.
JVoiceXML JVoiceXML一个开源的VoiceXML解析器.
Woodstox Woodstox是一个快速开源且符合StAX(STreaming Api for Xml processing)规范的XML处理器(做为一个处理器意味着它可以处理输入(相当于解析)与输出(相当于写入,序列化))。
xalan xalan-java是一套xslt处理器,用来将XML文件转换为HTML,TEXT和XML等其他类型文件格式。支持XSLT1.0和XPATH 1.0版。开发人员可以通过命令行方式或在JAVA APPLET和SERVLET中使用,并可以作为自己开发的应用程序的类库使用。xalan-java实现的是transformation API for XML(TRaX)接口,此接口为jaxp1.2标准中的一部分。
XmlIO XmlIO是一个利用SAX来解析XML然后创建Java对象并同时调用这些对象setter方法的框架.这个框架还能够把一张包含有单个根节点的Java对象图序列化成XML格式的字符串。
VTD-XML VTD-XML是一种新的XML处理API,它能够克服DOM和SAX的一些问题。VTD-XML能够在内存中对XML进行快速检查并提供XPath查询支持。 在它的主页上有详细的API描述,源代码,文档和例子。
Nux Nux是一个开源的Java工具,它能够让XML高效处理变得容易。Nux可嵌入到具有高吞吐量的XML消息中间件中比如:大型p2p底层结构,消息队列,发布-订阅和Blogs/新闻聚合的matchmaking系统,分布式系统,防火墙等.Nux集成并扩展XOM,Saxon和Lucene这些优秀的开源组件包以提供XQuery/XPath,全文本搜索等功能。
StAX StAX(Streaming API for XML)是标准的XML处理API,它能够从应用程序的stream对象解析XML数据或把XML数据转换成stream对象。StAX是一个用Java实现的XML拉式解析器。
Skaringa Skaringa提供一个类库实现Java object与XML文档的相互转换,并能够为Java class生成XML schema定义。
X2JB X2JB是一个Java开发类包用于把XML映射成Java实体。实际上它与JAXB、XML Beans、Jakarta Commons Digester 等相似但没有它们复杂。X2JB使用注释(annotation)来映射XML元素和元素属性。
http://lars.ruoff.free.fr/xmlcpp/ 列出了常用的XML库
现在用的功能基本是traverse功能,而不是写XML文件
用过的比较好用的: CMarkup www.firstobject.com C 库,使用简单,文档详细,在WINCE上速度可以
CMarkup使用UNICODE是定义MARKUP_STL,MARKUP_WCHAR
PugiXML 很好,就4个文件,添加方便,例子教的使用也好!
http://rapidxml.sourceforge.net/manual.html
http://www.ffuts.org/blog/quick-notes-on-how-to-use-rapidxml rapidxml的一个教程
那么再只好选pugixml,这个也还好用,没有用模板!
pugixml要使用UNICODE的话,是定义这个宏PUGIXML_WCHAR_MODE
,因为它不是使用模板!
pugixml如果要保留注释的话,需要使用
http://code.google.com/p/pugixml/issues/detail?id=50
pugi::xml_parse_result result = parser.load_buffer_inplace((void*)content.c_str(),
content.length()*sizeof(wchar_t), pugi::parse_comments|pugi::parse_declaration);
pugixml保存到文件:如果没有wchar_t的保存文件函数,要把文件名转为char的也是保存的一样的内容(如源文件为UNICODE,保存的也是UNICODE,源文件是UTF8的话,保存的也是UTF8)
char szTempBuf[MAX_PATH+1] = {0};
::WideCharToMultiByte(CP_ACP, 0, m_strWriteFile, -1, szTempBuf, MAX_PATH, 0, 0);
parser.save_file(szTempBuf);
如果读出来的数据是UNICODE的话,保存文件parser.save_file会默认保存为UNICDOE有UNICODE BOM,如果读出来的是UTF8的,却不会写UTF8 BOM头。
在文件的beging加内容的唯一办法是把整个文件读出来重新写过。
http://forums.whirlpool.net.au/archive/362008
The only way to do this is to rewrite the file out completely.
This isn't a limitation of C++, it's just the way most OSs' file manipulation functions work.
不过很可惜,rapidxml在VC6和EVC4下不能正常工作,同一个例程在VS2005和VS2008上就能正常工作!
I don't believe RapidXML has any support for Visual C 6 which is over a decade old by this point. I'm sure you've heard this before but you should really consider moving to a modern C compiler. Microsoft does provide a free copy ofVisual Studio 2008 Express which is quite capable.
http://lars.ruoff.free.fr/xmlcpp/
Xalan : XML XSLT apache的另一个xml解析库http://xalan.apache.org/