Libxml2库提供了C语言解析和构造xml文档的接口,为后台C语言处理程序和前台应用程序提供了一种通用的通迅方式。 html
本文以libxml2-2.6.30版原本说明Libxml2库的使用方法。 node
1. 编译库文件 api
libxml2-2.6.30.tar.gz文件解压后,进入libxml2-2.6.30文件夹,顺序执行如下命令: spa
chmod +x ./configure 指针 ./configure code make xml make install htm |
“chmod +x ./configure”命令增长configure脚本的可执行权限; 接口
“./configure”脚本根据当前编译系统的实际状况生成相应的makefile文件; ci
“make”命令执行上一命令中生成的makefile文件生成相应的目标文件;
“make install”命令主要把目标文件拷贝到/usr/local目录下,
/usr/local/lib目录下为如下库文件: libxml2.a libxml2.la libxml2.so libxml2.so.2 libxml2.so.2.6.30 pkgconfig xml2Conf.sh /usr/local/include/libxml2目录是Libxml库使用时须要的头文件,包含在libxml子目录下; |
2. 使用Libxml2库
Libxml2库的api参考能够从http://www.xmlsoft.org/html/index.html查询。下面以解析一个简单的xml文件为例,给出一个完整的例子。
Xml文档:
<ioMsg> <type>she</type> <subtype> <st1>123</st1> <st2>563</st2> </subtype> </ioMsg> |
C解析代码xmltest.c:
#include <libxml/parser.h> #include <libxml/tree.h> int main(int argc, char* argv[]) { xmlDocPtr doc; //定义解析文档指针 xmlNodePtr curNode; //定义结点指针(你须要它为了在各个结点间移动) xmlChar *szKey; //临时字符串变量 char *szDocName; if (argc <= 1) { printf("Usage: %s docname/n", argv[0]); return(0); } szDocName = argv[1]; doc = xmlReadFile(szDocName,"GB2312",XML_PARSE_RECOVER); //解析文件 if (NULL == doc) { printf("Document not parsed successfully/n"); return -1; } curNode = xmlDocGetRootElement(doc); //肯定文档根元素 if (NULL == curNode) { printf("empty document/n"); xmlFreeDoc(doc); return -1; } if (xmlStrcmp(curNode->name, BAD_CAST "ioMsg")) { printf("document of the wrong type, root node != ioMsg/n"); xmlFreeDoc(doc); return -1; } curNode = curNode->children; while(curNode != NULL) { //取出节点中的内容 szKey = xmlNodeGetContent(curNode); printf("Content value =%s/n", szKey); curNode = curNode->next; } xmlFreeDoc(doc); return 0; }
3. 编译xml解析程序
假设Libxml2库是按步骤1的编译方式,其库文件和头文件分别位于/usr/local/lib和/usr/local/include/libxml2目录下。
动态库编译方式: cc -o xmltest -I/usr/local/include/libxml2 -L/usr/local/lib -lxml2 xmltest.c |
“-I/usr/local/include/libxml2”指定Libxml2库的头文件所在的路径,“-L/usr/local/lib”指定动态库所在路径。