使用方法:
使用c++寫代碼時,發現需要讀取一個比較複雜的xml文件,但是感覺Filestorage似乎處理不了,所以採用引入Xml解析庫的方式試圖解決。其中有很多種。覺得TinyXml比較簡單,方便使用(畢竟只是需要讀取一下簡單類型的xml文件)。於是在網上查了一下使用方法,真的很方便,只要將六個文件添加到工程中就可以了,分別是tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。可以在網址中下載到點擊打開鏈接
使用VS進行編寫工程的時候,需要在六個文件中添加#include”stdafx.h“ 當使用TinyXml需要引入頭文件#include”tinyxml.h“。
使用舉例
使用在工程讀取的xml文件作爲例子吧;xml結構如下所示
解析的代碼如下所示:
ImgGraph GraphFusion::loadData(string path){
ImgGraph graphs;
TiXmlDocument doc;
if (!doc.LoadFile(".\\graphs\\0hsv.xml")){
cout << "Errors come with loading File";
}
TiXmlElement* root = doc.FirstChildElement();
if (root == NULL){
cout << "No root element" << endl;
}
TiXmlElement* graph = root->FirstChildElement();//屬性爲opencv_storage
TiXmlElement* E_node = graph->FirstChildElement();//屬性爲graph
while (E_node){
string key_str = E_node->GetText();//得到index中的內容,不過是char*類型或者string類型
//藉助stringstream 進行類型轉換
stringstream ss;
int key;
ss <<key_str;
ss >> key;
E_node = E_node->NextSiblingElement();//下一個兄弟元素,屬性爲V_Node
TiXmlElement* E_ImgNode = E_node->FirstChildElement();//得到子元素,ImgNode
while (E_ImgNode){
TiXmlElement* E_content = E_ImgNode->FirstChildElement();//得到子元素,Rindex
stringstream ssnode;
int index;
float weight;
string index_str = E_content->GetText();//得到Rindex中的內容
//類型轉換
ssnode << index_str;
ssnode >> index;
E_content = E_content->NextSiblingElement();//下一個兄弟節點,weight
string weight_str =E_content->GetText();//得到weight中的內容
//類型轉換
stringstream ssWeight;
ssWeight << weight_str;
ssWeight >> weight;
//插入到graphs中
graphs.insertNode(key, ImgNode(index, weight));
E_ImgNode = E_ImgNode->NextSiblingElement();//繼續ImgNode下一個兄弟節點
}
E_node = E_node->NextSiblingElement();//繼續V_Node 的下一個兄弟節點
}
return graphs;
}
剛開始的時候沒有怎麼看TinyXml文檔,一通亂寫,後面看了文檔,纔沒有怎麼出錯。還是要養成看文檔的習慣,不然感覺都不會使現成的工具;
寫一下,萬一哪一天自己又用到了呢