解析步驟
1 讀取xml文件內容
以文件流的方式讀取xml文件到char型數組中
char* ReadFiel(const char* fileName)
{
FILE* file = fopen(fileName,"rb");
if (file==0)
{
return 0;
}
fseek(file,0,SEEK_END);
size_t len = ftell(file);
fseek(file,0,SEEK_SET);
char* data = new char[len+1];
memset(data,0,len+1);
fread(data,1,len,file);
fclose(file);
return data;
}
2 解析xml
void AnalysisXML()
{
char* xml = ReadFiel("case.xml");
if (xml==0)
{
return;
}
rapidxml::xml_document<> doc; //創建xml文檔對象
rapidxml::xml_node<>* root; //創建xml節點(根節點)
rapidxml::xml_node<>* childNode; //創建xml節點(子節點)
try
{
doc.parse<0>(xml); //解析xml文檔
root = doc.first_node(); //得到根節點
childNode= root->first_node(); //得到根節點下的第一個子節點
for (;childNode;childNode=childNode->next_sibling())//遍歷childNode的兄弟節點
{
//獲取節點的屬性,並賦值給xml文檔的節點屬性對象xml_attribute<>* attrxxx
rapidxml::xml_attribute<>* attrName = childNode->first_attribute("name");
rapidxml::xml_attribute<>* attrStart = childNode->first_attribute("start");
rapidxml::xml_attribute<>* attrEnd = childNode->first_attribute("end");
rapidxml::xml_attribute<>* attrFile = childNode->first_attribute("file");
//輸出屬性值
cout<<attrName->value()<<endl;
cout<<attrStart->value()<<endl;
cout<<attrEnd->value()<<endl;
cout<<attrFile->value()<<endl;
}
}
catch (...)
{
}
delete []xml;
}
總結如下:
轉自:http://blog.csdn.net/angellove156/article/details/50623914
解析xml文件:
首先,通過文件讀取IO流,
然後,將IO流,轉換爲char數組 buffer
解析buffer內的數據:
1 創建xml doc:
xml_doument<> doc;
2 解析數據:
doc.parse<0>(buffer), 0 是按照默認方式進行解析
3 xml的 構成:
xml_node<>:
xml_attribute<>
4 包含關係:
xml_node<> 包含 xml_attribute<>
xml_attribute<>是 鍵值對的形式:
name 對應一個屬性值
5 獲取根節點:
xml_node<> *root_node = doc.first_node()
如果找某個名字的節點:
xml_node<> *nameNode = root_node->first_node(“name”);
找同一個名字的其它節點:
xml_node<> *anotherNode = nameNode->next_sibling();
如果找某個節點的 某個名字的屬性:
方法可以參考 找某個名字的節點
得到屬性的值:
調用其value方法。