C语言读写XML文档:libmxml库初学笔记(Mini-XML)

使用XML存取数据很方便。html

对应这个需求我选用了libmxml库,官网https://www.msweet.org/mxml/index.htmlnode

官网有详尽的英文手册,这里还找到了一份中文手册:编辑器

https://blog.csdn.net/bluesonic/article/details/3887143#mxmlEntityGetName学习

这里只放本身学习时写的测试代码,有兴趣的同窗能够作个参考。测试

#include<mxml.h>spa

//建立xml文档 //声明建立 xml树须要的 node节点
    mxml_node_t* xml; // xml格式标记
    mxml_node_t* keys_n; // 词汇库,unkey-词汇主键的父节点
    mxml_node_t* unikey_n; //一条词汇记录的基本单元,mark-词汇标签 和 explain-词汇释义 的父节点
    mxml_node_t* elem_n;  //建立 mark explain 的节点 //在内存中经过挂载node节点,构建 xml tree
    xml=mxmlNewXML("1.0");//建立xml文档格式标记,必须,xml tree的根
    keys_n=mxmlNewElement(xml, "keys");//新节点,名为keys,挂载到 xml
    unikey_n=mxmlNewElement(keys_n, "unikey");//新节点,名为unikey,挂载到 keys
    mxmlElementSetAttr(unikey_n, "word", "go alpha");//为unikey_n的节点设置属性:word="go alpha"
    elem_n=mxmlNewElement(unikey_n, "elem");//新节点,名为elem, 挂载到unikey
    mxmlElementSetAttr(elem_n, "element", "mark");//为elem_n的节点设置属性:element="mark"
    mxmlNewText(elem_n, 0, "AI");//为elem_n的节点新增文本,文本前的whitespace(空格)个数为0,内容为”AI”
    elem_n=mxmlNewElement(unikey_n, "elem");//新节点,名为elem, 挂载到unikey
    mxmlElementSetAttr(elem_n, "element", "explain");//为elem_n的节点设置属性:element="explain"
 mxmlNewText(elem_n, 0, "Google的AI程序");//为elem_n的节点新增文本,文本前的whitespace(空格)个数为0 //将内存中建立的节点树写入文件
    FILE *fp = fopen("/Users/yaou/Area/tmp/xmltest-1.xml", "w"); mxmlSaveFile(xml, fp, MXML_NO_CALLBACK); //关闭文件
 fclose(fp); //释放内存中的 节点树
    mxmlDelete(xml);

以后手动在新文件xmltext-1.xml 里添加里一些节点。.net

//读取xml文件 //读取xml文件内容到内存 ,挂载到 tree节点
    FILE *fp = fopen("/Users/yaou/Area/tmp/xmltest-1.xml", "r"); mxml_node_t* tree=mxmlLoadFile(NULL, fp, MXML_TEXT_CALLBACK); //载入完毕可关闭文件
 fclose(fp); //遍历节点
    mxml_node_t* tmp = NULL; mxml_node_t* elem_tmp = NULL; int i=1; for(tmp=mxmlFindElement(tree, tree, "unikey", "word", NULL, MXML_DESCEND); tmp!=NULL; tmp=mxmlFindElement(tmp, tree, "unikey", "word", NULL, MXML_DESCEND) ) { printf("第%d个unikey节点:\n",i); //打印word属性值
        printf("属性word=[%s]\n",mxmlElementGetAttr(tmp,"word")); //按 节点名为elem 属性element="mark" 查找子节点
        elem_tmp=mxmlFindElement(tmp, tmp, "elem","element","mark", MXML_DESCEND_FIRST); //打印子节点的 文本
        printf("\t子节点 mark文本=[%s]\n",mxmlGetText(elem_tmp, 0)); i++; } //重置节点文本
    if(i==2){ mxml_node_t* reset=mxmlFindElement(tree , tree, "elem", "element","explain",MXML_DESCEND); mxmlSetText(reset,1, "替换文本"); } //将内存中的节点树从新写入另外一文件
    FILE *fpo = fopen("/Users/yaou/Area/tmp/xmltest-2.xml", "w"); mxmlSaveFile(tree, fpo, MXML_NO_CALLBACK); //关闭文件
 fclose(fpo); //释放内存中的 节点树
    mxmlDelete(tree);

PS:小经验code

尽可能统一 节点名 和 属性名 的命名,用 节点属性值 区分数据的类型 能简化数据的取用。xml

推荐一个编辑器 Atomhtm

相关文章
相关标签/搜索