1. 程式人生 > >windows客戶端開發--使用tinyxml庫解析xml檔案

windows客戶端開發--使用tinyxml庫解析xml檔案


例如,微信windows客戶端使用的duilib庫中,介面就是用xml進行描述的。

所以,今天我們就來談一談windows客戶端中,也就是C++中如何解析xml。

很多時候,我們都使用.ini檔案來儲存一些資料。

xml確實是有很多的優點,某種程度上來說也確實可以完全取代ini,但也並非如有些人鼓吹的處處都比ini強。

 xml,對於描述複雜的資料結構非常的方便,缺點相對ini使用麻煩一點。在表達較短的配置時,沒有ini簡練。而且因為它有比較嚴格的格式審查機制,容錯性也不是特別好,在手寫時容易出現錯誤。拋開配置的功能,作為儲存傳輸資料的手段,xml還有個缺點就是它的處理和儲存的效率非常低下,解析速度慢,佔用更多的儲存空間。

 ini,通常用於對軟體的引數進行配置和記錄。優點是使用方便,嵌入程式也容易,幾個介面就夠了,很容易掌握。配置檔案更小巧,手工配置也更容易。缺點是它的結構只有2層,對於複雜型別資料描繪就顯得比較無力了。另外ini檔案有64kb的大小限制。

 對於很小的簡單配置來說,ini無疑是一種更簡練,方便的實現方式。而xml則適合應付更復雜的需求。

如何讀寫ini檔案,我們之前的部落格已經介紹過了,windows系統給我們提供了api。

現在就來講講如何解析xml.

這裡,我們使用一個開源庫叫做tinyxml

原始碼:

https://sourceforge.net/projects/tinyxml/點選開啟連結

原始碼不長,我們可以直接引入原始碼。

首先我們寫一個xml。這裡需要注意的是,推薦使用notepad++,而不是使用windows自帶的記事本。

建立一個xml,test.xml

<?xml version="1.0" encoding="utf-8"?>
<Strings>
  <!--system button-->
  <String>
    <StringKey>MinimizeTips</StringKey>
    <StringValue>最小化</StringValue>
  </String>
  
  <String>
    <StringKey>MaximizeTips</StringKey>
    <StringValue>最大化</StringValue>
  </String>
<Strings>


接下來,我們就是要把上面的xml讀取出來,並以key-value的形式存入map中。map的使用我們也不再贅述,之前的部落格有有過介紹。

首先是建立一個XMLDocument的物件;

然後就是通過xml的路徑,匯入檔案

可以使用RootElement獲得根節點

可以使用FirstChildElement獲得第一個子節點

可以使用NextSiblingElement獲得下一個節點

可以使用GetText方法獲得節點中的字串

void ReadXmlToMap(const std::string& path, std::map<std::string, std::string>& string_map)
{
	tinyxml2::XMLDocument doc;
	doc.LoadFile(path.c_str());
	tinyxml2::XMLElement *root = doc.RootElement();
	tinyxml2::XMLElement *node = root->FirstChildElement("String");
	while (node)
	{
		tinyxml2::XMLElement *key_element = node->FirstChildElement();
		tinyxml2::XMLElement *value_element = key_element->NextSiblingElement();
		string_map.insert(std::pair<std::string, std::string>(key_element->GetText(), value_element->GetText()));
		node = node->NextSiblingElement();
	}	
}