使用方法:
使用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文档,一通乱写,后面看了文档,才没有怎么出错。还是要养成看文档的习惯,不然感觉都不会使现成的工具;
写一下,万一哪一天自己又用到了呢