Mini-XML(MXML)的交叉编译与使用

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

如有错误,敬请斧正

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值