43.linux下安装libxml2:测试解析xml格式文本数据


参考文章:
https://blog.csdn.net/qingzhuyuxian/article/details/82596386

一:XML简介:

XML 指可扩展标记语言(eXtensible Markup Language)。
XML 被设计用来传输和存储数据。
XML 很重要,也很容易学习。
可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输。

二:编译:

sudo tar -zxvf libxml2-2.9.9.tar.gz -C .
sudo chown -R aston libxml2-2.9.9
mkdir install_lib
sudo ./configure --prefix=/home/aston/huawei/libxml2-2.9.9/install_lib 
sudo make
sudo make install

三:测试:

1.代码:

/****************************************
 *练习libxml库,创建通讯录xml文档,新增一个通讯录,
 *如果xml文件存在,则添加一个新节点
 *如果xml文件不存在,则新建一个xml文件
 *
 *@author: Anker  @date: 2014/02/09
 * ***************************************/
 
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
 
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xmlmemory.h>
 
#define ID_STR_LEN        16
#define NAME_STR_LEN         32
#define TEL_STR_LEN         16
#define ADDR_STR_LEN         128
 
//电话通讯录结构体
typedef struct phone_t {
    int id;              //编号
    char name[NAME_STR_LEN];     //姓名
    char tel[TEL_STR_LEN];       //电话
    char address[ADDR_STR_LEN];  //地址
}phone;
 
//设置通讯录项
static void set_phone_item(phone *phone_item)
{
    assert(phone_item);
 
    phone_item->id = 10;
    snprintf(phone_item->name, NAME_STR_LEN, "%s", "Anker");
    snprintf(phone_item->tel, TEL_STR_LEN, "%s", "13223246599");
    snprintf(phone_item->address, ADDR_STR_LEN, "%s", "Shenzheng");
}
 
//创建phone节点
static xmlNodePtr create_phone_node(const phone *phone_item)
{
    assert(phone_item);
    
    char id[ID_STR_LEN] = {0};
    xmlNodePtr phone_node = NULL;
    
    phone_node = xmlNewNode(NULL, BAD_CAST"phone");
    if (phone_node == NULL) {
    fprintf(stderr, "Failed to create new node.\n");
    return NULL;
    }
    //设置属性
    snprintf(id, ID_STR_LEN, "%d", phone_item->id);
    xmlNewProp(phone_node, BAD_CAST"id", (xmlChar*)id);
 
    xmlNewChild(phone_node, NULL, BAD_CAST"name", (xmlChar *)phone_item->name);
    xmlNewChild(phone_node, NULL, BAD_CAST"tel", (xmlChar *)phone_item->tel);
    xmlNewChild(phone_node, NULL, BAD_CAST"address", (xmlChar *)phone_item->address);
 
    return phone_node;
}
 
//向根节点中添加一个phone节点
static int add_phone_node_to_root(xmlNodePtr root_node)
{
    xmlNodePtr phone_node = NULL;
    phone *phone_item = NULL;
 
    //创建一个新的phone
    phone_item = (phone *)malloc(sizeof(phone));
    if (phone_item == NULL) {
    fprintf(stderr, "Failed to malloc memory.\n");
    return -1;
    }
    set_phone_item(phone_item);
 
    //创建一个phone节点
    phone_node = create_phone_node(phone_item); 
    if (phone_node == NULL) {
    fprintf(stderr, "Failed to create phone node.\n");
    goto FAILED;
    }
    //根节点添加一个子节点
    xmlAddChild(root_node, phone_node);
    free(phone_item);
 
    return 0;
FAILED:
    if (phone_item){
    free(phone_item);
    }
    return -1;
}
 
//创建phone_books
static int create_phone_books(const char *phone_book_file)
{
    assert(phone_book_file);
 
    xmlDocPtr doc = NULL;
    xmlNodePtr root_node = NULL;
 
    //创建一个xml 文档
    doc = xmlNewDoc(BAD_CAST"1.0");
    if (doc == NULL) {
    fprintf(stderr, "Failed to new doc.\n");
    return -1;
    }
 
    //创建根节点
    root_node = xmlNewNode(NULL, BAD_CAST"phone_books");
    if (root_node == NULL) {
    fprintf(stderr, "Failed to new root node.\n");
    goto FAILED;
    }
    //将根节点添加到文档中
    xmlDocSetRootElement(doc, root_node);
 
    if (add_phone_node_to_root(root_node) != 0) {
    fprintf(stderr, "Failed to add a new phone node.\n");
    goto FAILED;
    }
    //将文档保存到文件中,按照utf-8编码格式保存
    xmlSaveFormatFileEnc(phone_book_file, doc, "UTF-8", 1);
    //xmlSaveFile("test.xml", doc);
    xmlFreeDoc(doc);
 
    return 0; 
FAILED:
    if (doc) {
    xmlFreeDoc(doc);
    }
 
    return -1;
}
 
static int add_phone_node(const char *phone_book_file)
{
    assert(phone_book_file);
 
    xmlDocPtr doc = NULL;
    xmlNodePtr root_node = NULL;
    xmlNodePtr phone_node = NULL;
    phone *phone_item = NULL;
    
    doc = xmlParseFile(phone_book_file);
    if (doc == NULL) {
    fprintf(stderr, "Failed to parser xml file:%s\n", phone_book_file);
    return -1;
    }
 
    root_node = xmlDocGetRootElement(doc);
    if (root_node == NULL) {
    fprintf(stderr, "Failed to get root node.\n");
    goto FAILED;
    }
    
    if (add_phone_node_to_root(root_node) != 0) {
    fprintf(stderr, "Failed to add a new phone node.\n");
    goto FAILED;
    }
    //将文档保存到文件中,按照utf-8编码格式保存
    xmlSaveFormatFileEnc(phone_book_file, doc, "UTF-8", 1);
    xmlFreeDoc(doc);
 
    return 0;
FAILED:
    if (doc) {
    xmlFreeDoc(doc);
    }
 
    return -1;
}
 
int main(int argc, char *argv[])
{
	//#define PHONE_BOOK_FILE     "phone_book.xml"
    const char *phone_book_file = "phone_book.xml";
 
    if (argc == 2) 
	{
   	 	phone_book_file = argv[1];
    }
 
    if (access(phone_book_file, F_OK) == 0) 
	{
	    //文件存在,添加一个新的phone节点
	    add_phone_node(phone_book_file);
    }
    else 
	{
	    //文件不存在,创建一个信息的phone book
	    create_phone_books(phone_book_file);
    }
 
    return 0;
}


2.编译:

aston@ubuntu:/mnt/hgfs/share/source_insight/main_135/test_libxml2$ make
g++ test_libxml2.cpp -g -I./include -L./lib -lxml2 -ldl -lpthread -o app.out

3.运行后当前目录下生成的文件 phone_book.xml 的内容:

<?xml version="1.0" encoding="UTF-8"?>
<phone_books>
  <phone id="10">
    <name>Anker</name>
    <tel>13223246599</tel>
    <address>Shenzheng</address>
  </phone>
</phone_books>

在这里插入图片描述

四:移植:

sudo tar -zxvf libxml2-2.9.9.tar.gz -C .
sudo chown -R aston libxml2-2.9.9
mkdir install_lib

sudo ./configure --prefix=/home/aston/huawei_linux/libxml2-2.9.9/install_lib --host=arm-linux CC=/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-gcc CXX=/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-g++ --without-zlib --without-lzma --without-python

sudo make
sudo make install

五:移植遇到的问题:

1…/configure 出现3处报错:
找不到 zlib 库文件
找不到 lzma 库文件
找不到 python 库文件

fatal error: zlib.h: No such file or directory等

解决:
配置时取消相关库:

--without-zlib --without-lzma --without-python
 

完全的配置项:

sudo ./configure --prefix=/home/aston/huawei_linux/libxml2-2.9.9/install_lib --host=arm-linux CC=/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-gcc CXX=/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-g++ --without-zlib --without-lzma --without-python

2.报错:
/mnt/test # ./app.out
./app.out: can’t load library ‘libxml2.so.2’

原因:无法找到链接库:
解决: 将xml2相关动态库拷贝到/mnt/test/lib,并在/etc/profile中添加链接库的路径:
注:因为/usr/lib/没有空间了,所以新建了一个lib路径:

PATH="/usr/bin:/usr/sbin:/bin:/sbin"
set_path_before /usr/local/sbin
set_path_before /usr/local/bin
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib:/lib:/mnt/test/lib"
export PATH
export LD_LIBRARY_PATH

在这里插入图片描述

3.测试成功:

/mnt/test # echo $LD_LIBRARY_PATH
/usr/local/lib:/usr/lib:/lib:/mnt/test/lib
/mnt/test # ./app.out 
/mnt/test # ls
app.out         lib             phone_book.xml  res
boa             live555         pic
/mnt/test # cat phone_book.xml 
<?xml version="1.0" encoding="UTF-8"?>
<phone_books>
  <phone id="10">
    <name>Anker</name>
    <tel>13223246599</tel>
    <address>Shenzheng</address>
  </phone>
</phone_books>
/mnt/test # 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值