一、XML是什麼
XML(Extensible Markup Language)是一種標記語言。XML被用來傳輸和存儲數據。
XML 是一種樹結構。
一個china.xml的文件:
第一行是XML的申請,說明版本號和編碼格式,編碼格式可以不寫。
<?xml version="1.0" encoding="UTF-8"?>
該文件中<china>
是根元素,<city>
元素都被包含在<china>
元素中,<city>
元素包含四個子元素:<name>
、<area>
、<population>
、<gdp>
。其中<name>
元素含有屬性isBig
,屬性值必須加引號。
所有的元素都應該有對應的關閉標籤,比如<city>
對應</city>
。
XML標籤對大小寫敏感,<city>
和<City>
是不同的。
XML中的註釋如下:
<!-- 這是一個註釋 -->
二、Mini-XML開源庫的安裝
Mini-XML官網: https://www.msweet.org/mxml/
我下載的版本是Mini-XML 2.10
其他解析XML的開源庫有:tinyxml,putyxml
將壓縮包下載,然後進行解壓,再安裝,安裝步驟:
tar xzvf mxml-2.10.tar.gz
cd mxml-2.10/
./configure
make
sudo make install
注意:編譯文件的時候需要添加 -lmxml
,-lpthread
測試安裝是否成功,編譯testmxml.c
文件(該文件在解壓目錄下),然後執行。
gcc testmxml.c -lmxml -lpthread
./a.out test.xml
XML瀏覽器:MiTeC xml viewer
Mini-XML的中文文檔:https://blog.csdn.net/bluesonic/article/details/3887143
三、Mini-XML的基本操作
通過Mini-XML庫的接口,實現前面的china.xml
文件的內容,並將內容保存到china.xml
文件中。然後再解析china.xml
文件中的內容,打印顯示。
makefile
文件爲:
# get all .c files
srcFiles=$(wildcard *.c)
# all .c files --> .o files
objFiles=$(patsubst %.c,%.o,$(srcFiles))
all:$(objFiles)
%.o:%.c
gcc $^ -o $@ -lmxml -lpthread
.PHONY:print
print:
@echo $(srcFiles)
@echo $(objFiles)
# 定義僞目標,防止有歧義
.PHONY:clean
clean:
-rm -f $(objFiles)
create_xml.c
文件:
/******************************************************************************
* File: create_xml.c
*
* Author: Seaworth
* Created: 03/06/20
* Description: 生成china.xml文件
*****************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <mxml.h>
int main(int argc, char *argv[])
{
// 文件頭
mxml_node_t* root = mxmlNewXML("1.0");
// 根標籤
mxml_node_t* china = mxmlNewElement(root, "china");
// 子標籤
// 北京
mxml_node_t* city = mxmlNewElement(china, "city");
mxml_node_t* info = mxmlNewElement(city, "name");
// 給標籤賦值
mxmlNewText(info, 0, "北京");
// 設置屬性
mxmlElementSetAttr(info, "isBig", "Yes");
info = mxmlNewElement(city, "area");
mxmlNewText(info, 0, "16410平方公里");
info = mxmlNewElement(city, "population");
mxmlNewText(info, 0, "2171萬人");
info = mxmlNewElement(city, "gdp");
mxmlNewText(info, 0, "24541億元");
// 重慶
city = mxmlNewElement(china, "city");
info = mxmlNewElement(city, "name");
// 給標籤賦值
mxmlNewText(info, 0, "重慶");
// 設置屬性
mxmlElementSetAttr(info, "isBig", "Yes");
info = mxmlNewElement(city, "area");
mxmlNewText(info, 0, "82402平方千米");
info = mxmlNewElement(city, "population");
mxmlNewText(info, 0, "3124萬人");
info = mxmlNewElement(city, "gdp");
mxmlNewText(info, 0, "23605.77億元");
// 保存到china.xml
FILE* fp = fopen("china.xml", "w");
mxmlSaveFile(root, fp, MXML_NO_CALLBACK);
fclose(fp);
mxmlDelete(root); // 刪除
return 0;
}
read_xml.c
文件:
/******************************************************************************
* File: read_xml.c
*
* Author: Seaworth
* Created: 03/06/20
* Description: 解析xml文件-china.xml
*****************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <mxml.h>
int main(int argc, char *argv[])
{
FILE *fp;
mxml_node_t *tree;
// 打開china.xml文件,並加載
fp = fopen("china.xml", "r");
tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
mxml_node_t *city_node;
// 找到第一個city的節點
city_node = mxmlFindElement(tree, tree, "city", NULL, NULL, MXML_DESCEND);
// 循環打印
while(city_node){
mxml_node_t *node = mxmlFindElement(city_node, tree, "name", NULL, NULL, MXML_DESCEND);
// 打印name的isBig屬性
printf("name [isBig] attr:%s\n", mxmlElementGetAttr(node, "isBig"));
printf("name:%s\n", mxmlGetText(node, 0));
node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
printf("area:%s\n", mxmlGetText(node, 0));
node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
printf("population:%s\n", mxmlGetText(node, 0));
node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
printf("gdp:%s\n", mxmlGetText(node, 0));
printf("====================================\n");
// 查找
city_node = mxmlFindElement(city_node, tree, "city", NULL, NULL, MXML_NO_DESCEND);
}
mxmlDelete(tree);
fclose(fp);
return 0;
}
編譯指令:
make
./create_xml.o
./read_xml.o
執行./read_xml.o
的結果爲: