libxml2的编译与安装

1. 下载和安装LIBXML2
    Libxml2是个C语言的XML程式库,能简单方便的提供对XML文件的各种操作,并且支持XPATH查询,及部分的支持XSLT转换等功能。Libxml2的下载地址是
http://xmlsoft.org/
,完全版的库是开源的,并且带有例子程式和说明文件。最佳将这个库先下载下来,因为这样能查看其中的文件和例子。
由于我是在linux下用C语言进行研发的,所以我下载的是libxml2-2.6.20.tar.gz版本的源码包。
具体安装步骤:
   解压:$tar zxvf libxml2-2.6.20.tar.gz
   进入解压后的安装目录:$cd libxml2-2.6.20
   安装三部曲:1 )$./configure
                       2 )  $make
                       3 )  $make install
安装完毕。

2.libxml资料查询
     关于libxml库的相关头文件和API在这里我就不介绍了,内容太多,可以参考相关资料,进入libxml官方网站: http://xmlsoft.org/
3.一个简单程序的编译

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<libxml/xmlmemory.h>
#include<libxml/parser.h>

int main()
{
 xmlDocPtr doc=xmlNewDoc(BAD_CAST"1.0");
 xmlNodePtr root_node=xmlNewNode(NULL,BAD_CAST"root");
 xmlDocSetRootElement(doc,root_node);
 xmlNewTextChild(root_node,NULL,BAD_CAST "newNode1",BAD_CAST "newNode1 content");
 xmlNewTextChild(root_node,NULL,BAD_CAST "newNode2",BAD_CAST "newNode2 content");
 xmlNewTextChild(root_node,NULL,BAD_CAST "newNode3",BAD_CAST "newNode3 content");
 xmlNodePtr node=xmlNewNode(NULL,BAD_CAST "node2");
 xmlNodePtr content=xmlNewText(BAD_CAST "NODE CONTENT");
 xmlAddChild(root_node,node);
 xmlAddChild(node,content);
 xmlNewProp(node,BAD_CAST "attribute",BAD_CAST "yes");
 node=xmlNewNode(NULL,BAD_CAST "son");
 xmlAddChild(root_node,node);
 xmlNodePtr grandson=xmlNewNode(NULL,BAD_CAST "grandson");
 xmlAddChild(node,grandson);
 xmlAddChild(grandson,xmlNewText(BAD_CAST "This is a grandson node"));
 int nRel=xmlSaveFile("CreatedXml.xml",doc);
 if(nRel!=-1)
 {
   xmlFreeDoc(doc);
   return 1;
 }
}

在用libxml2尝试做解析xml文件,编译的时候出现了找不到头文件的错误:

  1. [nigelzeng@myhost xml-learning]$ gcc -o xml-build xml-build.c                

  2. xml-build.c:4:30: libxml/xmlmemory.h: 没有那个文件或目录  

  3. xml-build.c:5:27: libxml/parser.h: 没有那个文件或目录  

  4. xml-build.c:8: error: syntax error before "doc"

  5. xml-build.c: In function `parseStory':  

  6. xml-build.c:9: error: `xmlChar' undeclared (first use in this function)  

  7. xml-build.c:9: error: (Each undeclared identifier is reported only once  

  8. xml-build.c:9: error: for each function it appears in.)  

  9. ……  

问题出自啊c文件里的include:

  1. #include <libxml/xmlmemory.h>

  2. #include <libxml/parser.h>

默认会到/usr/include 目录下搜索,但是不存在libxml目录,而libxml是在/usr/include/libxml2/libxml 下。

所以我先做了一个软连接:

  1. [nigelzeng@myhost xml-learning]$ ln -s /usr/include/libxml2/libxml /usr/include/libxml  

再尝试着编译,路径的问题是解决了,但是链接库的问题还在,内建的函数找不到:

  1. [nigelzeng@myhost xml-learning]$ gcc -o xml-build xml-build.c  

  2. /tmp/cc62WqCk.o(.text+0x24): In function `parseStory':  

  3. : undefined reference to `xmlStrcmp'  

  4. /tmp/cc62WqCk.o(.text+0x3e): In function `parseStory':  

  5. : undefined reference to `xmlNodeListGetString'  

  6. /tmp/cc62WqCk.o(.text+0x62): In function `parseStory':  

  7. : undefined reference to `xmlFree'  

  8. /tmp/cc62WqCk.o(.text+0x85): In function `parseDoc':  

  9. : undefined reference to `xmlParseFile'  

  10. /tmp/cc62WqCk.o(.text+0xb7): In function `parseDoc':  

  11. : undefined reference to `xmlDocGetRootElement'  

  12. /tmp/cc62WqCk.o(.text+0xe4): In function `parseDoc':  

  13. : undefined reference to `xmlFreeDoc'  

  14. /tmp/cc62WqCk.o(.text+0xff): In function `parseDoc':  

  15. : undefined reference to `xmlStrcmp'  

  16. /tmp/cc62WqCk.o(.text+0x127): In function `parseDoc':  

  17. : undefined reference to `xmlFreeDoc'  

  18. /tmp/cc62WqCk.o(.text+0x14e): In function `parseDoc':  

  19. : undefined reference to `xmlStrcmp'  

  20. /tmp/cc62WqCk.o(.text+0x17c): In function `parseDoc':  

  21. : undefined reference to `xmlFreeDoc'  

  22. collect2: ld returned 1 exit status  

在网上搜索了下答案,可以在gcc命令后加上 -I 和 -l 参数解决:

  1. [nigelzeng@myhost xml-learning]$ gcc -o xml-build xml-build.c -I/usr/include/libxml2/ -lxml2  

用这个命令,所有的错误都解决了,成功编译出来需要的执行文件。

这个 -I 和 -l 的参数解释是这样的:

-Idir当用#include <file> 链接文件的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他会先在你所制定的目录查找,然后再按常规的顺序去找。

-llibrary制定编译的时候使用的库。

例子用法: gcc -lcurses hello.c   /* 使用ncurses库编译程序 */

所以“gcc -o xml-build xml-build.c -I/usr/include/libxml2/ -lxml2”命令的意思就是“在指定目录/usr/include/libxml2里寻找头文件,编译时使用的库是xml2函数库”

### 回答1: Libxml2是一个用于解析XML文档的开源软件库,它支持XML1.0、XML的命名空间、XML Schema以及XSLT等。在Libxml2中,sax1是一种基于事件的XML解析器,它可以逐个读取XML文档中的每个元素,并在解析时触发事件,从而达到解析XML文档的目的。 要编译sax1,请按照以下步骤操作: 1.在终端中打开libxml2的源代码地址。 2.使用命令./configure --with-sax1来启用sax1编译选项。这个命令将在编译时添加--with-sax1选项,以便将sax1解析器链接到libxml2库中。 3.执行make命令以编译libxml2。 4.执行make install命令以安装libxml2。 5.在你的应用程序中包含libxml2头文件,并连接到libxml2库,以便使用sax1解析器来解析你的XML文档。 需要注意的是,在使用sax1解析器时,你需要创建一个回调函数来处理解析事件。具体实现可以参考libxml2官方文档中的相关示例。同时,建议使用glib库来管理内存和错误处理,以避免内存泄漏和运行时错误。 ### 回答2: libxml2是一个XML C解析库,其中包含了各种所需的工具和函数。SAX(Simple API for XML)是一种解析XML的方法,基于解析器和事件驱动模型,适用于大型XML文档。对于某些应用程序来说,使用SAX可以比DOM(Document Object Model)更高效地解析XML文档。 要编译libxml2的SAX1模块,需要遵循以下步骤: 1. 确认安装libxml2库及其开发文件(libxml2-dev或xml2-dev)。可以在终端中使用以下命令进行检查: ``` dpkg -s libxml2-dev ``` 2. 下载libxml2源代码,可以在http://xmlsoft.org/sources/ 找到最新的版本。 3. 解压缩源代码,进入源代码文件夹,使用以下命令进行编译: ``` ./configure --with-sax1 && make ``` --with-sax1选项告诉编译器要编译SAX1模块。make命令会编译源代码并生成库文件。 4. 如果编译成功,可以在源代码文件夹下的.slibs或.libs文件夹中找到生成的库文件。 5. 编写程序时需要引用libxml/parser.h头文件,并链接编译生成的库文件。使用SAX解析XML文件时需要注册解析器回调函数,并在解析时触发这些回调函数。 总的来说,编译libxml2的SAX1模块需要先确认安装了相关开发文件,然后通过配置选项告诉编译器要编译SAX1模块,最后生成库文件并在程序中引用。 ### 回答3: libxml2是一款开源的XML解析器,支持SAX和DOM两种解析方式。其中SAX解析方式是基于事件驱动的,需要用户自定义解析处理函数来响应不同的XML事件,适合解析大型XML文件和流式数据。 要编译libxml2的sax1模块,需要安装libxml2的开发包和sax1的头文件。在Linux系统中,可使用以下命令安装: sudo apt-get install libxml2-dev 安装后,进入libxml2源代码目录,运行以下命令: ./configure --with-sax1 make make install 其中,--with-sax1参数用于启用sax1模块,make命令用于编译,make install命令用于安装。 在编译过程中,可能会遇到一些依赖项缺失的错误,需要根据提示安装相应的依赖包。编译成功后,就可以在代码中使用sax1模块来解析XML数据了。 总之,编译libxml2的sax1模块需要安装开发包、头文件和依赖项,并使用特定的命令启用和编译sax1模块。对于熟悉Linux操作的开发者来说,这个过程并不复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值