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

相關文章
相關標籤/搜索