Linux从用户层到内核层系列 - 开源项目之Libxml2

题记:本系列文章的目的是抛开书本从源代码和使用的角度分析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

 

 

 

 


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值