C語言直接處理xml數據是很麻煩的,使用xmllib2.so庫函數,能方便的解析、生成xml數據。
目錄
-
libxml2.so庫安裝
-
程序效果
-
關鍵代碼
-
參考資料
libxml2.so庫安裝
截圖1.CentOS安裝libxml2
執行命令“yum install libxml2”即可。
程序效果
1.讀取xml文件
截圖2.xml文件內容
截圖3.讀取並打印
讀取部分邏輯稍微複雜一點,有2層xml節點,需要循環讀取。
Tips:編譯時gcc參數需要包含xmllib2的頭文件及庫,具體路徑需要查看安裝xmllib2之後在哪裏。
2.創建xml文件
截圖4.生成的xml文件
只創建1層的xml節點。
關鍵代碼
1.解析xml節點內容:
int parse_phone(xmlDocPtr doc, xmlNodePtr cur)
{
assert(doc || cur);
xmlChar *key;
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
//讀取name節點
if (!xmlStrcmp(cur->name, (const xmlChar *)"name"))
{
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf("name:%s\t", key);
xmlFree(key);
}
//讀取tel節點
if (!xmlStrcmp(cur->name, (const xmlChar *)"tel"))
{
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf("tel:%s\t", key);
xmlFree(key);
}
//讀取address節點
if (!xmlStrcmp(cur->name, (const xmlChar *)"address"))
{
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf("address:%s\t", key);
xmlFree(key);
}
printf("\n");
cur = cur->next;
}
return 0;
}
2.創建xml數據:
int create_phone_book()
{
xmlDocPtr doc = NULL;
xmlNodePtr phone_books=NULL;
//創建xml文檔
doc = xmlNewDoc(BAD_CAST "1.0");
//添加xml節點並設定爲根節點
phone_books = xmlNewNode(NULL, BAD_CAST "phone_books");
xmlDocSetRootElement(doc, phone_books);
//根節點下創建3個子節點
xmlNewTextChild(phone_books, NULL, BAD_CAST "name", BAD_CAST "Tom");
xmlNewTextChild(phone_books, NULL, BAD_CAST "tel", BAD_CAST "102918267437");
xmlNewTextChild(phone_books, NULL, BAD_CAST "address", BAD_CAST "New York");
//保存文件
xmlSaveFormatFileEnc(XML_OUTPUT_FILE, doc, "UTF-8", 1);
//釋放資源
xmlFree(phone_books);
xmlFreeDoc(doc);
xmlCleanupParser();
xmlMemoryDump();
return 0;
}
參考資料
1.libxml2的安裝及使用
https://blog.csdn.net/zhangna20151015/article/details/51332550