题记:本系列文章的目的是抛开书本从源代码和使用的角度分析Linux内核和相关源代码,byhankswang和你一起玩转linux开发
轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com
**
欢迎加入到CHLK – Linux开发交流群 QQ:327084515 讨论Linux开发相关问题**
开源项目之Libxml2
由于工作中使用到libxml2的库函数,并且为libxml2提BUG和作者
Daniel Veillard的交流,写一篇小博,来简单介绍一下libxml2。
Libxml2介绍
Libxml2的C语言版的xml解析器,项目的初衷是为Gnome项目开发的开源工具,是一个基于MIT License的免费开源软件(MIT License是一款比GPL/LGPL/BSD更为宽松的授权条款)。 Libxml2能在Linux, Unix, Windows,CygWin, MacOS, MacOS X, RISC Os, OS/2, VMS, QNX, MVS, VxWorks等系统上良好的运行。在跨平台数据传输中libxml2的兼容性非常好。Libxml2开源社区的官方网站是www.xmlsoft.org,主要作者和维护者是Daniel Veillard。
Libxml2的主要特性
Libmxl2 是libxml1的升级版本,现在libxml1已经停止支持和使用了。Libxml2中有一些主要的特性如:libxml2支持完整的xpath、xpointer、xinclude的实现;libxml2是支持ANSI C/POSIX标准的纯C语言实现;基本支持HTTP协议和FTP协议(FTP功能可用于远程支持xml文件的获取和解析)等。
Libxml2在ubuntu环境下的安装
在ubuntu中默认是不带有Libxml2的动态库和头文件的,libxml2的安装需要从libxml2的官方网站下载源代码然后编译安装。步骤如下:
A: 从xmlsoft站点或ftp(ftp.xmlsoft.org)站点下载libxml2压缩包(libxml2-xxxx.tar.gz)
B: 解压缩源代码的压缩包:tar –xf libxml2-xxxx.tar.gz
C: 在源代码文件夹中运行如下命令: ./configure -> make -> make install
D: 检查ubuntu系统中libxml2的头文件和动态库文件是否安装完毕:头文件的安装位置在/usr/local/include/libxml2/libxml,在该目录下安装了必要的编译头文件;libxml2的动态库文件安装在/usr/lib/i386-linux-gnu/目录下。至此,libxml2已经安装完毕了。
Libxml2支持的主要协议和国际标准
Libxml2支持丰富的W3C的关于xml和web的标准,主要支持的标准如下:
the XMLstandard: http://www.w3.org/TR/REC-xml
Namespaces inXML: http://www.w3.org/TR/REC-xml-names/
RFC 2396 : Uniform Resource Identifiers http://www.ietf.org/rfc/rfc2396.txt
XML Path Language(XPath) 1.0: http://www.w3.org/TR/xpath
HTML4 parser: http://www.w3.org/TR/html401/
XML Pointer Language(XPointer) Version 1.0: http://www.w3.org/TR/xptr
XML Inclusions (XInclude)Version 1.0: http://www.w3.org/TR/xinclude/
ISO-8859-x encodings,as well as rfc2044 [UTF-8] and rfc2781 [UTF-16] Unicode encodings, and more if using iconvsupport
Relax NG, ISO/IEC19757-2:2003, http://www.oasis-open.org/committees/relax-ng/spec-20011203.html
W3C XML Schemas Part2: Datatypes REC 02 May 2001
使用Libxml2来编写程序
对于xml的创建、解析、修改、查找等基本功能,我们以代码的形式来简述libxml2的API是如何使用的,代码的方式是以C语言的形式来编写以GCC编译器来编译执行的。实例代码中的主要函数通过蓝色字体标出,以示重点。
主要函数说明:
l xmlNewDoc()用来创建XML文档
l xmlNewNode()用来向XML文档中添加节点
l xmlNewChild()用来向XML文档中添加子节点
l xmlNewProp()用来设置元素和属性
l xmlSaveFormatFileEnc()用来把XML文件从内存中拷贝到磁盘中,可以设置文件的编码格式
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
int main(int argc, char **argv)
{
xmlDocPtr doc = NULL;
xmlNodePtr root_node= NULL, node = NULL, node1 = NULL;
doc = xmlNewDoc(BAD_CAST "1.0"); /* 创建一个新的xml文档 */
root_node =
xmlNewNode(NULL, BAD_CAST "root");
xmlDocSetRootElement(doc, root_node);
/* 创建新的节点,挂在根节点的下面 */
xmlNewChild(root_node, NULL, BAD_CAST"node1",BAD_CAST "content of node1");
node=xmlNewChild(root_node,NULL, BAD_CAST "node3", BAD_CAST"node has attributes");
xmlNewProp(node,BAD_CAST "attribute", BAD_CAST "yes");
node =xmlNewNode(NULL, BAD_CAST "node4");
node1 =xmlNewText(BAD_CAST"other way to create content");
xmlAddChild(node,node1);
xmlAddChild(root_node,node);
/* 把创建的XML文件从内存中导入到磁盘上 */
xmlSaveFormatFileEnc(argc> 1 ? argv[1] : "-", doc, "UTF-8", 1);
xmlFreeDoc(doc);
xmlCleanupParser();
xmlMemoryDump();//debugmemory for regression tests
return(0);
}
更多的libxml2的API的说明请参考libxml2官方网站的API说明:http://www.xmlsoft.org/html/index.html
Libxml2构架浅析
libxml2采用了模块化编程的思想,整个架构是由多个模块组成的,模块的选择是可以根据需要裁减的,可裁剪模块化编程的思想和linux内核有异曲同工之妙,既可以支持多种功能,有可以在有限的物理空间下裁减不需要的部分。Libxml2的主要模块如下:
Ø 输入输出模块
Ø FTP和HTTP客户端支持模块(可选)
Ø 国际通用编码支持模块
Ø URI模块
Ø XML解析模块
Ø SAX解析模块
Ø HTML解析模块(可选)
Ø DOM解析模块
Ø XPath模块
Ø 调试模块(可选)
对于libxml2的图形化构架的描述如下图:
Libxml2与XML相关的问题
对于XML语法和使用本文并没有做出具体的讨论,本文的出发点是希望提供一种跨平台的对于XML的支持。 Libxml2的源代码文件有3833个(libxml2-2.7.2),并在持续开发中,对于libxml2的C语言代码编程和API说明,官方网站上有大量的实例。另外对于libxml2 BUG的提交可以访问http://www.xmlsoft.org/bugs.html。