使用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