libxml2编译错误问题

本文提供了一个使用libxml2库解析XML文件的C语言示例程序。该程序通过命令行接收XML文件名作为输入,并解析出文件中特定节点的内容。文章还解决了编译过程中遇到的常见错误,例如找不到头文件等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装环境略;

测试源码:

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

void
parseStory(xmlDocPtr doc,xmlNodePtr cur)
{
        xmlChar *key;
        cur = cur->xmlChildrenNode;
        while(cur != NULL)
        {
                if((!xmlStrcmp(cur->name,(const xmlChar*)"keyword")))
                {
                        key = xmlNodeListGetString(doc,cur->xmlChildrenNode,1);
                        printf("keyword:%s\n",key);
                        xmlFree(key);
                }
                cur = cur->next;
        }
        return;
}

static void
parseDoc(char *docname)
{
        xmlDocPtr doc;
        xmlNodePtr cur;
        doc = xmlParseFile(docname);
        if(doc == NULL)
        {
                fprintf(stderr,"Document not parse successfull.\n");
                return;
        }
        cur = xmlDocGetRootElement(doc);
        if(cur == NULL)
        {
                fprintf(stderr,"empty document\n");
                xmlFreeDoc(doc);
                return;
        }
        if(xmlStrcmp(cur->name,(const xmlChar*)"story"))
        {
                fprintf(stderr,"document of the wrong type root node != story");
                xmlFreeDoc(doc);
                return;
        }
        cur=cur->xmlChildrenNode;
        while(cur != NULL)
        {
                if((!xmlStrcmp(cur->name,(const xmlChar*)"storyinfo")))
                {
                        parseStory(doc,cur);
                }
                cur=cur->next;
        }
        xmlFreeDoc(doc);
        return;
}

int
main(int argc,char **argv)
{
        char *docname;
        if(argc<=1)
        {
                printf("Usage:%s docname\n",argv[0]);
                return(0);
        }
        docname=argv[1];
        parseDoc(docname);
        return(1);
}

出现的错误:gcc test.c - o test

xml.c:4:29: error: libxml/xmlmemory.h: No such file or directory
xml.c:5:26: error: libxml/parser.h: No such file or directory
xml.c:8: error: expected ‘)’ before ‘doc’
xml.c:14:44: warning: missing terminating " character
xml.c:14: error: missing terminating " character
xml.c: In function ‘parseDoc’:
xml.c:28: error: ‘xmlDocPtr’ undeclared (first use in this function)
xml.c:28: error: (Each undeclared identifier is reported only once
xml.c:28: error: for each function it appears in.)
xml.c:28: error: expected ‘;’ before ‘doc’
xml.c:29: error: ‘xmlNodePtr’ undeclared (first use in this function)
xml.c:29: error: expected ‘;’ before ‘cur’
xml.c:30: error: ‘doc’ undeclared (first use in this function)
xml.c:36: error: ‘cur’ undeclared (first use in this function)
xml.c:43: error: expected ‘)’ before ‘xmlChar’
xml.c:52: error: ‘sur’ undeclared (first use in this function)
xml.c:52: error: expected ‘)’ before ‘xmlChar’

解决办法:

用命令:gcc xml.c -o xml -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函数库”

ps:

这个命令也可以成功编译:gcc `xml2-config --cflags --libs` -o xml-create xml-create.c

### 回答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来管理内存和错误处理,以避免内存泄漏和运行时错误。 ### 回答2libxml2是一个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、付费专栏及课程。

余额充值