C#中讀取xml文件通過添加引用 using System.Xml; 創建 通過XML 文檔操作對象來讀取
現在需要在c++中來讀取xml文件,查閱資料發現比較常用的方法有以下四種:
Qt/TinyXml2/RapidXml/PugiXml
網上的執行效率對比圖:PugiXml最快,所以就著重寫下PugiXml
方法一、Qt
因為網友評論最慢,所以也沒有去測試和實踐
方法二:TinyXML
TinyXML下載地址:https://sourceforge.net/projects/tinyxml/
官方文檔:TinyXML
TinyXML是個解析庫,它由兩個頭文件(.h文件)和四個CPP文件(.cpp文件)構成,用的時候,只要將(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)導入工程就可以用它的東西了。如果需要,可以將它做成自己的DLL來調用。
方法三、RapidXml
RapidXml是一個XML DOM解析工具包,適用于C++的xml解析器。整個解析器包含在rapidxml.hpp、rapidxml_utils.hpp、rapidxml_print.hpp、rapidxml_iterators.hpp這四個頭文件中(前三個較常用),頭文件獲取方式及在線手冊在以下鏈接。
方法四:PugiXml
pugixml是一個輕量級的C ++ XML操作庫。
Pugixml包含三個文件pugixml.cpp、 pugixml.hpp 、 pugiconfig.hpp。
pugixml.hpp是主頭文件,要使用pugixml類及其方法必須將它包含到工程中。pugiconfig.hpp是pugixml的配置文件,例如配置是否使用寬字符模式(#define PUGIXML_WCHAR_MODE)pugixml.cpp是源文件,該文件需設置為不使用預編譯頭。
表示樹的c++類型只有三種(xml_document、xml_node、xml_attribute);xml_node上的某些操作僅對某些節點類型有效。它們描述如下。
Xml_document是整個文檔結構的所有者;其功能包含加載/保存文檔等,銷毀它將銷毀整個文檔。xml_document的接口由加載函數、保存函數和xml_node的整個接口組成,該接口允許檢查和/或修改文檔。注意,雖然xml_document是xml_node的子類,但xml_node不是多態類型;繼承只是為了簡化使用。
Xml_node是文檔節點的句柄;它可以指向文檔中的任何節點,包括文檔本身。所有類型的節點都有一個公共接口。注意,xml_node只是實際節點的句柄,而不是節點本身——可以有幾個xml_node句柄指向相同的底層對象。銷毀xml_node句柄不會銷毀該節點,也不會將其從樹中刪除。
xml_node類型有一個特殊值,稱為空節點或空節點。它不對應于任何文檔中的任何節點,因此類似于空指針。但是,所有操作都是在空節點上定義的;通常,這些操作不做任何事情,返回空節點/屬性或空字符串作為其結果。這對于鏈接調用很有用;也就是說,你可以像這樣獲得一個節點的祖父結點:node.parent().parent();如果一個節點是一個空節點或它沒有父節點,第一個父()調用返回null節點;第二個parent()調用也返回null節點,因此您不必檢查錯誤兩次。你可以通過隱式布爾類型轉換來測試句柄是否為空:if (node){…}或if (!node){…}。
xml_attribute是XML屬性的句柄;它具有與xml_node相同的語義,即可以有多個xml_attribute句柄指向相同的底層對象,并且有一個特殊的null屬性值,它將傳播到函數結果。
使用:
<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 "));
// 分別讀取每個學生信息
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());
}
}
}