C++使用TinyXml實現(xiàn)讀取XMl文件
xml
什么是xml
目前,對xml的使用非常廣泛,讀取和設(shè)置xml配置文件是我們最常用的操作。常見C/C++ XML解析器有Tinyxml、XERCES、squashxml、xmlite、pugxml、libxml等等,這些解析器有些是支持多語言的,有些只是單純C/C++的。
TinyXML是目前非常流行的一款基于DOM模型的XML解析器,簡單易用且小巧玲瓏,非常適合存儲簡單數(shù)據(jù),配置文件,對象序列化等數(shù)據(jù)量不是很大的操作。這個解析庫的模型通過解析XML文件,然后在內(nèi)存中生成DOM模型,從而讓我們很方便的遍歷這棵XML樹。
- XML 指可擴展標(biāo)記語言( EX tensible M arkup L anguage)
- XML 是一種 標(biāo)記語言 ,很類似 HTML
格式示例
<Persons>、<Person>、、<desc> 分別為標(biāo)簽,標(biāo)簽內(nèi)包含了要傳遞的信息。
標(biāo)簽必須成對出現(xiàn),有開始標(biāo)簽就需要有結(jié)束標(biāo)簽,例如:
**開始標(biāo)簽:<name>
結(jié)束標(biāo)簽:</name> **
<Persons>
<Person ID="1">
<name>Kobe</name>
<age>24</age>
</Person>
<Person ID="2">
<name>Michael</name>
<age>23</age>
</Person>
</Persons>下載TinyXml
官網(wǎng)下載: https://sourceforge.net/projects/tinyxml/
安裝:解壓縮tinyXML后,將這六個文件添加到你的C++工程中,分別是tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。在需要操作xml文件的地方,包含tinyxml.h,就可以引入TinyXML類庫(#include "tinyxml.h")。
TinyXml結(jié)構(gòu)
| 類名 | 說明 |
|---|---|
| TiXmlBase | 整個TinyXML模型的基類。 |
| TiXmlAttribute | 對應(yīng)于XML中的元素的屬性。 |
| TiXmlNode | 對應(yīng)于DOM結(jié)構(gòu)中的節(jié)點。 |
| TiXmlComment | 對應(yīng)于XML中的注釋 |
| TiXmlDeclaration | 對應(yīng)于XML中的申明部分,即<?versiong=“1.0” ?> |
| TiXmlDocument | 對應(yīng)于XML的整個文檔 |
| TiXmlElement | 對應(yīng)于XML的元素 |
| TiXmlText | 對應(yīng)于XML的文字部分 |
| TiXmlUnknown | 對應(yīng)于XML的未知部分 |
| TiXmlHandler | 定義了針對XML的一些操作 |
實戰(zhàn) 讀取XMl
測試的xml文件
第一行表示版本以及編碼格式。

需要建立對應(yīng)的結(jié)構(gòu)體
struct Cookbook
{
string name;
vector<string> food;
vector<string> spices;
vector<string> step;
void clear()
{
name.clear();
food.clear();
spices.clear();
step.clear();
}
};使用到的API
加載xml文件:
bool TiXmlDocument::LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );
使用給定的文件名解析加載文件。 如果成功返回true。
返回根節(jié)點
TiXmlElement* TiXmlDocument::RootElement()
獲取該節(jié)點對應(yīng)的文本
const TIXML_STRING& TiXmlElement::ValueTStr()
獲取第一個子節(jié)點
const TiXmlElement* FirstChildElement() const;
獲取下一個子節(jié)點
const TiXmlElement* NextSiblingElement() const;
獲取該節(jié)點對應(yīng)的文本
const char* GetText() const;
設(shè)計一個ParseXML類
傳入一個xml文件路徑,就會傳出所有的Cookbook。
class ParseXML
{
public:
ParseXML();
~ParseXML();
bool ReadParaXml(string m_strXmlPath, vector<Cookbook>& vecNode);
};#include "ParseXML.h"
ParseXML::ParseXML()
{
}
ParseXML::~ParseXML()
{
}
bool ParseXML::ReadParaXml(string m_strXmlPath, vector<Cookbook>& vecNode)
{
Cookbook* pNode = new Cookbook();
//讀取xml文件中的參數(shù)值
TiXmlDocument* Document = new TiXmlDocument();
if (!Document->LoadFile(m_strXmlPath.c_str()))
{
cout << "無法加載xml文件!" << endl;
cin.get();
return false;
}
TiXmlElement* RootElement = Document->RootElement(); //根目錄
TiXmlElement* NextElement = RootElement; //根目錄下的第一個節(jié)點層
while (NextElement != NULL) //判斷有沒有讀完
{
if (NextElement->ValueTStr() == "menu") //讀到menu節(jié)點
{
TiXmlElement* BoxElement = NextElement->FirstChildElement();
while (BoxElement->ValueTStr() != "name") //讀到name節(jié)點
{
BoxElement = BoxElement->NextSiblingElement();
}
pNode->name = BoxElement->GetText();
BoxElement = BoxElement->NextSiblingElement();
while (BoxElement->ValueTStr() == "food") // 讀到food節(jié)點
{
pNode->food.push_back(BoxElement->GetText());
BoxElement = BoxElement->NextSiblingElement();
}
while (BoxElement->ValueTStr() == "spices") // 讀到spices節(jié)點
{
pNode->spices.push_back(BoxElement->GetText());
BoxElement = BoxElement->NextSiblingElement();
}
while (BoxElement != nullptr && BoxElement->ValueTStr() == "step")// 讀到step節(jié)點
{
pNode->step.push_back(BoxElement->GetText());
BoxElement = BoxElement->NextSiblingElement();
}
vecNode.push_back(*pNode);
pNode->clear();
}
NextElement = NextElement->NextSiblingElement();
}
//釋放內(nèi)存
delete pNode;
delete Document;
cout << "完成xml的讀取" << endl;
return true;
}測試結(jié)果
因為我這個是QT做的ui界面,這里只需要關(guān)注內(nèi)容是否對應(yīng)即可。

到此這篇關(guān)于C++使用TinyXml實現(xiàn)讀取XMl文件的文章就介紹到這了,更多相關(guān)C++ TinyXml讀取XMl文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中函數(shù)指針與軟件設(shè)計經(jīng)驗總結(jié)
今天小編就為大家分享一篇關(guān)于C語言中函數(shù)指針與軟件設(shè)計經(jīng)驗總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
C語言中回調(diào)函數(shù)和qsort函數(shù)的用法詳解
這篇文章主要為大家詳細(xì)介紹一下C語言中回調(diào)函數(shù)和qsort函數(shù)的用法教程,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下2022-07-07
C語言數(shù)組入門之?dāng)?shù)組的聲明與二維數(shù)組的模擬
這篇文章主要介紹了C語言數(shù)組入門之?dāng)?shù)組的聲明與二維數(shù)組的模擬,數(shù)組學(xué)習(xí)的同時也要相應(yīng)理解C語言指針的作用,需要的朋友可以參考下2015-12-12
C++基礎(chǔ)之this指針與另一種“多態(tài)”
this指針識別了同一個類的不同的對象,換句話說,this指針使得成員函數(shù)可以訪問同一個類的不同對象。再深入一點,this指針使得成員函數(shù)會因為this指針的不同而訪問到了不同的成員變量2013-07-07
VC實現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法
這篇文章主要介紹了VC實現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法,比較實用的一個特殊功能,需要的朋友可以參考下2014-08-08

