C语言库学习(七):Linux库minixml3.1实验
minixml库官网 https://www.msweet.org/mxml/下载库 git clone https://github.com/michaelrsweet/mxml.git或者国内镜像 git clone https://gitee.com/xuehu96/mxml.git安装./configure --enable-threads=nomakesudo make ...
·
minixml库
官网 https://www.msweet.org/mxml/
下载库 git clone https://github.com/michaelrsweet/mxml.git
或者国内镜像 git clone https://gitee.com/xuehu96/mxml.git
安装
./configure --enable-threads=no
make
sudo make install
####### 下面执行后的显示 发现也是装在usr local lib下了
Installing libmxml.so to /usr/local/lib...
Installing libmxml.a to /usr/local/lib...
Installing documentation in /usr/local/share/doc/mxml...
Installing header files in /usr/local/include...
Installing pkgconfig files in /usr/local/lib/pkgconfig...
Installing man pages in /usr/local/share/man...
使用
需要使用export LD_LIBRARY_PATH=/usr/local/lib/
设置库的路径
加入头文件#include <mxml.h>
就可以了
生成XML文件
- 生成文件头
mxml_node_t *mxmlNewXML(const char * version)
- 删除节点内存
mxmlDelete(mxml_node_t *node)
- 添加一个新的节点
mxml_node_t *nxmlNewElement(mxml_node_t * parent,const char *name)
- 设置节点的属性名和属性值
void mxmlElementSetAttr(mxml_node_t *node,const char*name,const char*value)
- 创建节点的文本内容
mxml_node_t *mxmlNewText(mxml_node_t *parent,int whitespace,const char* string)
- 保存文件
int mxmlSaveFile(mxml_node_t *node, FILE* fp,mxml_save_cb_t cb)
- 最后一个参数默认MXML_NO_CALLBACK
#include <stdio.h>
#include <string.h>
#include <mxml.h>
int main()
{
//头
mxml_node_t *head = NULL;
head = mxmlNewXML("1.0");
//根标签
mxml_node_t *root = mxmlNewElement(head,"data");
//student1
mxml_node_t *ccc = mxmlNewElement(root,"students");
//1
mxml_node_t *info = mxmlNewElement(ccc,"name");
mxmlNewText(info,0,"汤圆");
mxmlElementSetAttr(info,"isXXX","true");
//2
info = mxmlNewElement(ccc,"age");
mxmlNewText(info,0,"20");
//3
info = mxmlNewElement(ccc,"address");
mxmlNewText(info,0,"XX省XX市");
//student2
ccc = mxmlNewElement(root,"students");
//1
info = mxmlNewElement(ccc,"name");
mxmlNewText(info,0,"汤圆2");
mxmlElementSetAttr(info,"isXXX","false");
//2
info = mxmlNewElement(ccc,"age");
mxmlNewText(info,0,"25");
//3
info = mxmlNewElement(ccc,"address");
mxmlNewText(info,0,"B省C市");
//保存文件
FILE* fp = fopen("student.xml","w");
mxmlSaveFile(head,fp,MXML_NO_CALLBACK);
fclose(fp);
mxmlDelete(head);//后序遍历
return 0;
}
<?xml version="1.0" encoding="utf-8"?>
<data>
<students>
<name isXXX="true">汤圆</name>
<age>20</age>
<address>XX省XX市</address>
</students>
<students>
<name isXXX="false">汤圆2</name>
<age>25</age>
<address>B省C市</address>
</students>
</data>
解析XML文件
- 从文件加载到内存
mxmlLoadFile(mxml_node_t *top/*一般为NULL*/,FILE *fp,MXML_NO_CALLBACK)
- 获取节点的属性
const char *mxmlElementGetAttr(mxml_node_t *node,const char *name)
- 获取指定节点文本内容
const char *mxmlGetText(mxml_node_t *node,int *whitespace/*是否有空格*/)
- 跳转到下一个节点
mxml_node_t * mxmlWalkNext(mxml_node_t *node/*当前节点*/,mxml_node_t *top/*根节点*/,int descend)
- descend:搜索规则
- MXML_NO_DESCEND:查看同层级
- MXML_DESCEND_FIRST:查看下一层级
- MXML_DESCEND:一直向下搜索
- 查找节点(快的)
mxml_node_t * mxmlFindElement(
mxml_node_t *node,//当前节点
mxml_node_t *top,//根节点
const char* name,//查找的标签名
const char* attr,//属性,没有NULL
const char* value,//查找的属性值
int descend //同上
)
parse.c
#include <stdio.h>
#include <mxml.h>
int main(int argc,const char **argv)
{
if(argc<2)
{
printf("./parse filename\n");
return 0;
}
FILE *fp = fopen(argv[1],"r");
mxml_node_t* root = mxmlLoadFile(NULL,fp,MXML_NO_CALLBACK);
mxml_node_t* find = mxmlFindElement(root,root,"students",NULL,NULL,MXML_DESCEND);
while(find)
{
//printf("name = %s,age = %s\n",,);
mxml_node_t *node = mxmlWalkNext(find,root,MXML_DESCEND_FIRST);
printf("name:%s ",mxmlGetText(node,0));
node = mxmlWalkNext(node,root,MXML_NO_DESCEND);
printf("age:%s ",mxmlGetText(node,0));
node = mxmlWalkNext(node,root,MXML_NO_DESCEND);
printf("addr:%s\n",mxmlGetText(node,0));
find = mxmlWalkNext(find,root,MXML_NO_DESCEND);
}
mxmlDelete(root);
fclose(fp);
return 0;
}
更多推荐
已为社区贡献2条内容
所有评论(0)