libxml2源码下载、编译,以及解析xml文件(C++版本)

5 篇文章 0 订阅
1 篇文章 0 订阅

1、首先下载libxml2源码并编译

#git clone https://gitlab.gnome.org/GNOME/libxml2.git

#cd libxml2
#mkdir build
#cd build 
#cmake ..
#make
#make install

2、例程如下

代码,test.cpp

/*
 * date   : 2020-10-22 
 * author : Mike
*/

#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>
  
typedef struct {
    char *name;
    char *author;
    char *date;
    char *type;
}book;
 
void printBook(book book1);
 
int main() {
    xmlDocPtr bookDocPtr;
    xmlNodePtr booksNodePtr;
 
    // libxml默认将各个节点间的空格当作一个节点
    xmlKeepBlanksDefault(0);
    bookDocPtr = xmlParseFile("testxml.xml");
    if (bookDocPtr == NULL) {
        fprintf(stderr, "xmlReadFile fail");
        exit(1);
    }
    book onebook;
    
    // root node
    booksNodePtr = xmlDocGetRootElement(bookDocPtr);
 
    // book node
    xmlNodePtr bookNodePtr = booksNodePtr->children;
    while (bookNodePtr) {
        // name
        xmlNodePtr namePtr = bookNodePtr->children;
        onebook.name = (char*)xmlNodeGetContent(namePtr);
 
        // author
        xmlNodePtr authorPtr = namePtr->next;
        onebook.author = (char*)xmlNodeGetContent(authorPtr);
 
        // date
        xmlNodePtr datePtr = authorPtr->next;
        onebook.date = (char*)xmlNodeGetContent(datePtr);
 
         // type
        xmlNodePtr typePtr = datePtr->next;
        onebook.type = (char*)xmlNodeGetContent(typePtr);

        printBook(onebook);
 
        bookNodePtr = bookNodePtr->next;
    }
 
    return 0;
}
 
void printBook(book book1) {
    printf("name: %s\n", book1.name);
    printf("author: %s\n", book1.author);
    printf("date: %s\n", book1.date);
    printf("type: %s\n", book1.type);
}

xml文件,testxml.xml

<?xml version="1.0" encoding="UTF-8" ?>
<books>
    <ietm1>
        <name id="1">1</name>
        <author>M</author>
        <date>2020</date>
        <type>A</type>
    </ietm1>
    <ietm2>
        <name>2</name>
        <author>N</author>
        <date>1022</date>        
        <type>B</type>
    </ietm2>
    <ietm3>
        <name>3</name>
        <author>O</author>
        <date>22</date> 
        <type>C</type>
    </ietm3>
</books>

3、测试

#g++ test.cpp -o test -lxml2 -I/usr/include/libxml2/libxml -Wl,-rpath=/usr/local/lib64/

#./test 
name: 1
author: M
date: 2020
type: A
name: 2
author: N
date: 1022
type: B
name: 3
author: O
date: 22
type: C
     

4、问题,如果编译有问题,发生找不到.h的情况,可能是头文件路径的问题,可以通过执行如下命令解决

cp /usr/include/libxml2/libxml /usr/include/libxml -rf

5、如果使用cmake,可添加如下配置到cMakelists.txt

# libxml2
include_directories(/usr/local/include/libxml2)
link_libraries(xml2)
add_executable(test test.c)

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值