C#中讀取xml文件通過(guò)添加引用 using System.Xml; 創(chuàng)建 通過(guò)XML 文檔操作對(duì)象來(lái)讀取
現(xiàn)在需要在c++中來(lái)讀取xml文件,查閱資料發(fā)現(xiàn)比較常用的方法有以下四種:
Qt/TinyXml2/RapidXml/PugiXml
網(wǎng)上的執(zhí)行效率對(duì)比圖:PugiXml最快,所以就著重寫(xiě)下PugiXml
方法一、Qt
因?yàn)榫W(wǎng)友評(píng)論最慢,所以也沒(méi)有去測(cè)試和實(shí)踐
方法二:TinyXML
TinyXML下載地址:https://sourceforge.net/projects/tinyxml/
官方文檔:TinyXML
TinyXML是個(gè)解析庫(kù),它由兩個(gè)頭文件(.h文件)和四個(gè)CPP文件(.cpp文件)構(gòu)成,用的時(shí)候,只要將(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)導(dǎo)入工程就可以用它的東西了。如果需要,可以將它做成自己的DLL來(lái)調(diào)用。
方法三、RapidXml
RapidXml是一個(gè)XML DOM解析工具包,適用于C++的xml解析器。整個(gè)解析器包含在rapidxml.hpp、rapidxml_utils.hpp、rapidxml_print.hpp、rapidxml_iterators.hpp這四個(gè)頭文件中(前三個(gè)較常用),頭文件獲取方式及在線手冊(cè)在以下鏈接。
方法四:PugiXml
pugixml是一個(gè)輕量級(jí)的C ++ XML操作庫(kù)。
Pugixml包含三個(gè)文件pugixml.cpp、 pugixml.hpp 、 pugiconfig.hpp。
pugixml.hpp是主頭文件,要使用pugixml類及其方法必須將它包含到工程中。pugiconfig.hpp是pugixml的配置文件,例如配置是否使用寬字符模式(#define PUGIXML_WCHAR_MODE)pugixml.cpp是源文件,該文件需設(shè)置為不使用預(yù)編譯頭。
表示樹(shù)的c++類型只有三種(xml_document、xml_node、xml_attribute);xml_node上的某些操作僅對(duì)某些節(jié)點(diǎn)類型有效。它們描述如下。
Xml_document是整個(gè)文檔結(jié)構(gòu)的所有者;其功能包含加載/保存文檔等,銷毀它將銷毀整個(gè)文檔。xml_document的接口由加載函數(shù)、保存函數(shù)和xml_node的整個(gè)接口組成,該接口允許檢查和/或修改文檔。注意,雖然xml_document是xml_node的子類,但xml_node不是多態(tài)類型;繼承只是為了簡(jiǎn)化使用。
Xml_node是文檔節(jié)點(diǎn)的句柄;它可以指向文檔中的任何節(jié)點(diǎn),包括文檔本身。所有類型的節(jié)點(diǎn)都有一個(gè)公共接口。注意,xml_node只是實(shí)際節(jié)點(diǎn)的句柄,而不是節(jié)點(diǎn)本身——可以有幾個(gè)xml_node句柄指向相同的底層對(duì)象。銷毀xml_node句柄不會(huì)銷毀該節(jié)點(diǎn),也不會(huì)將其從樹(shù)中刪除。
xml_node類型有一個(gè)特殊值,稱為空節(jié)點(diǎn)或空節(jié)點(diǎn)。它不對(duì)應(yīng)于任何文檔中的任何節(jié)點(diǎn),因此類似于空指針。但是,所有操作都是在空節(jié)點(diǎn)上定義的;通常,這些操作不做任何事情,返回空節(jié)點(diǎn)/屬性或空字符串作為其結(jié)果。這對(duì)于鏈接調(diào)用很有用;也就是說(shuō),你可以像這樣獲得一個(gè)節(jié)點(diǎn)的祖父結(jié)點(diǎn):node.parent().parent();如果一個(gè)節(jié)點(diǎn)是一個(gè)空節(jié)點(diǎn)或它沒(méi)有父節(jié)點(diǎn),第一個(gè)父()調(diào)用返回null節(jié)點(diǎn);第二個(gè)parent()調(diào)用也返回null節(jié)點(diǎn),因此您不必檢查錯(cuò)誤兩次。你可以通過(guò)隱式布爾類型轉(zhuǎn)換來(lái)測(cè)試句柄是否為空:if (node){…}或if (!node){…}。
xml_attribute是XML屬性的句柄;它具有與xml_node相同的語(yǔ)義,即可以有多個(gè)xml_attribute句柄指向相同的底層對(duì)象,并且有一個(gè)特殊的null屬性值,它將傳播到函數(shù)結(jié)果。
使用:
<Root>
<students>
<student>
<name>張三</name>
<sex>男</sex>
</student>
<student>
<name>李四</name>
<sex>男</sex>
</student>
<student>
<name>王五</name>
<sex>女</sex>
</student>
</students>
</Root>
void Read()
{
pugi::xml_document doc;
if (doc.load_file("students.xml",pugi::parse_default,pugi::encoding_utf8))
{
pugi::xml_node root_node = doc.child(_T("Root"));
pugi::xml_node students_node = root_node.child(_T("students "));
// 分別讀取每個(gè)學(xué)生信息
for (pugi::xml_node student_node = students_node.child(_T("student"));
student _node;
student _node = student _node.next_sibling(_T("student ")))
{
pugi::xml_node name_node = students_node.child(_T("name"));
printf("name : %s\n",name_node.first_child().value());
pugi::xml_node sex_node = student_node.child(_T("sex"));
printf("sex: %s\n",sex_node.first_child().value());
}
}
}