XML格式學習和Mini-XML解析的基本操作

一、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的結果爲:

在這裏插入圖片描述

四、參考

  1. Mini-XML 官網
  2. mini-XML 中文文檔
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章