minixml 移植开发

一、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 +x build_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, 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>

int main(int argc,char **argv)
{
        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, fp,MXML_TEXT_CALLBACK);
        fclose(fp);


        mxml_node_t *val,*id;
        node = mxmlGetFirstChild(tree);
        val = mxmlFindElement(node, tree, "password1",NULL, NULL,MXML_DESCEND);
        if(val){
                printf(": %s \n",val->child->value.text.string);
        }
        node = mxmlFindElement(tree, tree, "note",NULL, NULL,MXML_DESCEND);
        printf(" year:%s \n",mxmlElementGetAttr(node,"year"));
        printf(" date:%s \n",mxmlElementGetAttr(node,"date"));
        printf(" month:%s \n",mxmlElementGetAttr(node,"month"));
        id = mxmlFindElement(node, tree, "id",NULL, NULL,MXML_DESCEND);
        printf("[%s}\n",id->child->value.text.string);


        mxmlDelete(tree);
        return 0;
}

3、minixml空格无法解析问题

上面的代码,MXML_TEXT_CALLBACK 采用回调时,以空格进行分割
出现如下标签:
  <password0>FE-D0 18-00</password0>

会出现解析出来的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>

int main(int argc,char **argv)
{
        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, fp,MXML_OPAQUE_CALLBACK);
        fclose(fp);


        mxml_node_t *val,*id;
        node = mxmlGetFirstChild(tree);
        val = mxmlFindElement(node, tree, "password1",NULL, NULL,MXML_DESCEND);
        if(val){
                printf(": %s \n",val->child->value.opaque);
        }
        node = mxmlFindElement(tree, tree, "note",NULL, NULL,MXML_DESCEND);
        printf(" year:%s \n",mxmlElementGetAttr(node,"year"));
        printf(" date:%s \n",mxmlElementGetAttr(node,"date"));
        printf(" month:%s \n",mxmlElementGetAttr(node,"month"));
        id = mxmlFindElement(node, tree, "id",NULL, NULL,MXML_DESCEND);
        printf("[%s}\n",val->child->value.opaque);


        mxmlDelete(tree);
        return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值