一、minixml 介绍
1、minixml
是一个小型的开源的XML解析器,采用 C 语言开发。该解析器最大的特点就是小型、无须依赖其他类库
2、下载地址:
http://www.minixml.org/
二、移植minixml 库
1、解压到linux 下
tar mxml-2.10.tar.gz -C/home/yue/work0615/demolib/libxml/
cd/home/yue/work0615/demolib/libxml/
2、编写x86平台下编译脚本
vim build_x86.sh
内容如下:
OUTPUT=`pwd`/output/x86/
./configure --prefix=$OUTPUT
make clean
make
make install
3、编译输出:
chmod +xbuild_x86.sh
./build_x86.sh
4、可以在当前目录下输入output/x86/ 平台下运行的库
5、编写mips 平台编译脚本
OUTPUT=`pwd`/output/mips463/
./configure --prefix=$PREFIX --enable-shared --host=mips-linux CC=/opt/buildroot-gcc463/usr/bin/mipsel-linux-gcc
make clean
make
make install
6、编译输出
chmod +x build_mips.sh
./build_mips.sh
出现如下错误:
./testmxml: 1: ./testmxml: Syntax error: "(" unexpected
make: *** [testmxml] Error 2
Linking mxmldoc-static...
Generating API documentation...
./mxmldoc-static: 1: ./mxmldoc-static: Syntax error: "(" unexpected
由于xml库编译过程需要测试,所以在编译过程会执行 ./testxml 这个输出可执行文件,但编译平台为x86 ,输出的为mips 平台,导致后面的编译和安装无法执行
这个时候需要手动拷贝当前目录 以下几个库文件到我们的开发平台即可
libmxml.so
libmxml.so.1
libmxml.so.1.5
可以用file 查看: file libmxml.so.1.5
libmxml.so.1.5: ELF 32-bit LSB shared object,MIPS,MIPS32 rel2 version 1 (SYSV),dynamically linked,not stripped
三、相关参数描述
1、mxml 提取xml内容回调参数描述
mxmlLoadFile()和mxmlLoadString().这些函数的最后一个参数是一个回调函数,决定了在一个XML文档中每个数据节点的值的类型。
mxmlLoadFile(NULL,fp,MXML_OPAQUE_CALLBACK);
Mini-XML为简单XML数据文件定义了几个标准的回调函数:
MXML_INTEGER_CALLBACK-所有的数据节点包含以空格分割的整数。
MXML_OPAQUE_CALLBACK-所有的数据节点包含"不透明"字符串(CDATA)。
MXML_REAL_CALLBACK-所有的数据节点包含以空格分割的浮点数。
MXML_TEXT_CALLBACK-所有的数据节点包含以空格分割的文本字符串。
2、通过mxmlFindElement 提取节点内容时
mxml_node_t *val = mxmlFindElement(node,tree,"标签值",NULL,MXML_DESCEND);
MXML_DESCEND含义是一直向下直到树的根部
MXML_DESCEND_FIRST含义是向下搜索到一个节点的第一个匹配子节点,但不再继续向下搜索
MXML_NO_DESCEND含义是不查看任何的子节点在XML元素层次中,仅查看同级的伙伴节点或者父节点直到到达顶级节点或者给出的树的顶级节点.
四、编写开发测试例子
1、解析xml数据
<?xml version="1.0" encoding="gb2312" ?>
<note year="55" date="33" month="22"><id>5000</id>
<password0>FE-D0-18-00</password0>
<password1>FE-D0-18-01</password1>
</note>
2、解析程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<mxml.h>
{
if(argc<2){
printf("input xml file\n");
return -1;
}
FILE *fp;
mxml_node_t *tree,*node;
fp = fopen(argv[1],"r");
tree = mxmlLoadFile(NULL,MXML_TEXT_CALLBACK);
fclose(fp);
mxml_node_t *val,*id;
node = mxmlGetFirstChild(tree);
val = mxmlFindElement(node,"password1",MXML_DESCEND);
if(val){
printf(": %s \n",val->child->value.text.string);
}
node = mxmlFindElement(tree,"note",MXML_DESCEND);
printf(" year:%s \n",mxmlElementGetAttr(node,"year"));
printf(" date:%s \n","date"));
printf(" month:%s \n","month"));
id = mxmlFindElement(node,"id",MXML_DESCEND);
printf("[%s}\n",id->child->value.text.string);
mxmlDelete(tree);
return 0;
}
3、minixml空格无法解析问题
会出现解析出来的password 为:FE-D0 后面的18-00 没办法提取出来
带空格xml内容如下:
<?xml version="1.0" encoding="gb2312" ?>
<note year="55" date="33" month="22"><id>5000</id>
<password0>FE-D0 18-00</password0>
<password1>FE-D0 18-01</password1>
</note>
4、解析带空格的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<mxml.h>