1.交叉编译Mini-XML
下载地址:https://www.msweet.org/mxml/
官方说明文档:https://www.msweet.org/mxml/mxml.html
注:官方的说明文档我是挂了梯子才打开的,大家如果打不开的话可以试一下
文档的中文翻译:https://blog.csdn.net/bluesonic/article/details/3887143
我下载的是3.2版本
编译三步:
./configure --host=aarch64-linux-gnu --prefix=/home/liu/workspace/mxml
make
make install
--host=你的交叉编译工具链
--prefix=编译好后头文件和库文件存放位置
然后把库传到板子上即可
2.运行
上代码,说明在注释里:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include"mxml.h"
//回调函数,修改输出的格式
const char *whitespace_cb(mxml_node_t *node,int w)
{
printf(" curNode:%s; w: %d \n", mxmlGetElement(node), w);
//只在元素开始时换行
if (w == MXML_WS_BEFORE_OPEN //0 /* Callback for before open tag */
// || w == MXML_WS_AFTER_OPEN //1 /* Callback for after open tag */
// || w == MXML_WS_BEFORE_CLOSE //2 /* Callback for before close tag */
// || w == MXML_WS_AFTER_CLOSE ) //3 /* Callback for after close tag */
)
return ("\n");
else
return NULL;
}
//输入的字符串
char str[]="<?xml version=\"1.0\" encoding=\"gb2312\" ?>\n<note year=\"55\""
" date=\"33\" month=\"22\">\n <id> 6666</id>\n <password>FE-D0"
"-18-00</password>\n <data>1 2 3 4</data>\n</note>";
/*
<?xml version="1.0" encoding="gb2312" ?>
<note year="55" date="33" month="22">
<id> 6666</id>
<password>FE-D0-18-00</password>
<data>1 2 3 4</data>
</note>
*/
int main()
{
mxml_node_t *tree, *node;
int ret = -1;
int space=0; //判断test类型的节点的文本内开头是否有空格 1:有 /0:没有
printf("\n\n%s\n\n",str); //将输入的xml消息打印
//从字符串读取xml信息,MXML_TEXT_CALLBACK回调为将所有的元素都设为text类型,
//可自行编写回调函数来将元素设为对应的类型
tree = mxmlLoadString(NULL,str,MXML_TEXT_CALLBACK);
//查找note节点
node = mxmlFindElement(tree, tree, "note",NULL, NULL,MXML_DESCEND);
//查看note节点的属性
printf("year:%s \n",mxmlElementGetAttr(node,"year"));
printf("date:%s \n",mxmlElementGetAttr(node,"date"));
printf("month:%s \n",mxmlElementGetAttr(node,"month"));
mxml_node_t *id, *password, *data;
//查找id节点
id = mxmlFindElement(node, tree, "id",NULL, NULL,MXML_DESCEND);
printf("id space:%d ,value:%s\n",space,mxmlGetText(id, &space));
// printf("id[type=%d][value=%s}\n",id->type, id->child->value.text.string);
//查找password节点
password = mxmlFindElement(node, tree, "password",NULL, NULL,MXML_DESCEND);
printf("password space:%d ,%s \n",space,mxmlGetText(password, &space));
// printf("password[type=%d][value=%s}\n",password->type, password->child->value.text.string);
//遍历data节点的所有内容
//(mxml在将文本转化为text类型时,会将文本内容按空格分开 分别储存在子节点中)
data = mxmlFindElement(node, tree, "data",NULL, NULL,MXML_DESCEND);
mxml_node_t *top=data;
for (data = mxmlGetFirstChild(data); data != NULL; data = mxmlWalkNext(data, top, MXML_DESCEND))
{
printf("data space:%d ,%s \n",space,mxmlGetText(data, &space));
}
//两种添加节点方法
mxml_node_t *element = mxmlNewElement(node, "element");
mxmlNewText(element, 0, "text");
mxmlLoadString(node, "<element type='string'>another text</element>",MXML_NO_CALLBACK);
char *buff;
//将xml保存到字符串以便输出
#if 0 //通过whitespace_cb回调函数修改输出的格式
buff = mxmlSaveAllocString ( tree, whitespace_cb );
#else //不调用回调函数(不插人任何空格,制表符,回车符和换行符)
mxmlSetWrapMargin(0); //关闭自动折行,默认为75以方便阅读
buff = mxmlSaveAllocString ( tree, MXML_NO_CALLBACK );
#endif
if(buff==NULL)
perror("mxmlSaveFile err:");
else
{
printf("\n\n%s\n\n",buff);
free(buff);
}
mxmlDelete(tree); //释放内存
return 0 ;
}
先说下输入字符串的节点树,方便理解
?xml version="1.0" encoding="gb2312" ?
|
note
|
id - password - data
| | |
6666 FE-D0-18-00 1 - 2 - 3 - 4
其中“-”是指向同级节点的指针,而“ |” 是指向第一个子节点或父节点的指针。
编译指令:
aarch64-linux-gnu-gcc -o xml testmxml.c -I /home/liu/workspace/mxml/include -L /home/liu/workspace/mxml/lib -lmxml
运行结果:
3.说明
4.参考
https://lile777.blog.csdn.net/article/details/89884666
如有错误,敬请斧正