参考文章:
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 #