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;
}

在这里插入图片描述

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐