欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++使用TinyXml實(shí)現(xiàn)讀取XMl文件

 更新時(shí)間:2023年06月27日 11:22:32   作者:林夕07  
常見(jiàn)C/C++?XML解析器有Tinyxml、XERCES、squashxml、xmlite、pugxml、libxml等等,本文為大家介紹的是使用TinyXml實(shí)現(xiàn)讀取XMl文件,需要的可以參考一下

xml

什么是xml

目前,對(duì)xml的使用非常廣泛,讀取和設(shè)置xml配置文件是我們最常用的操作。常見(jiàn)C/C++ XML解析器有Tinyxml、XERCES、squashxml、xmlite、pugxml、libxml等等,這些解析器有些是支持多語(yǔ)言的,有些只是單純C/C++的。

TinyXML是目前非常流行的一款基于DOM模型的XML解析器,簡(jiǎn)單易用且小巧玲瓏,非常適合存儲(chǔ)簡(jiǎn)單數(shù)據(jù),配置文件,對(duì)象序列化等數(shù)據(jù)量不是很大的操作。這個(gè)解析庫(kù)的模型通過(guò)解析XML文件,然后在內(nèi)存中生成DOM模型,從而讓我們很方便的遍歷這棵XML樹(shù)。

  • XML 指可擴(kuò)展標(biāo)記語(yǔ)言( EX tensible M arkup L anguage)
  • XML 是一種 標(biāo)記語(yǔ)言 ,很類似 HTML

格式示例

<Persons>、<Person>、、<desc> 分別為標(biāo)簽,標(biāo)簽內(nèi)包含了要傳遞的信息。

標(biāo)簽必須成對(duì)出現(xiàn),有開(kāi)始標(biāo)簽就需要有結(jié)束標(biāo)簽,例如:

**開(kāi)始標(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后,將這六個(gè)文件添加到你的C++工程中,分別是tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。在需要操作xml文件的地方,包含tinyxml.h,就可以引入TinyXML類庫(kù)(#include "tinyxml.h")。

TinyXml結(jié)構(gòu)

類名說(shuō)明
TiXmlBase整個(gè)TinyXML模型的基類。
TiXmlAttribute對(duì)應(yīng)于XML中的元素的屬性。
TiXmlNode對(duì)應(yīng)于DOM結(jié)構(gòu)中的節(jié)點(diǎn)。
TiXmlComment對(duì)應(yīng)于XML中的注釋
TiXmlDeclaration對(duì)應(yīng)于XML中的申明部分,即<?versiong=“1.0” ?>
TiXmlDocument對(duì)應(yīng)于XML的整個(gè)文檔
TiXmlElement對(duì)應(yīng)于XML的元素
TiXmlText對(duì)應(yīng)于XML的文字部分
TiXmlUnknown對(duì)應(yīng)于XML的未知部分
TiXmlHandler定義了針對(duì)XML的一些操作

實(shí)戰(zhàn) 讀取XMl

測(cè)試的xml文件

第一行表示版本以及編碼格式。

需要建立對(duì)應(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é)點(diǎn)

TiXmlElement* TiXmlDocument::RootElement()

獲取該節(jié)點(diǎn)對(duì)應(yīng)的文本

const TIXML_STRING& TiXmlElement::ValueTStr()

獲取第一個(gè)子節(jié)點(diǎn)

const TiXmlElement* FirstChildElement() const;

獲取下一個(gè)子節(jié)點(diǎn)

const TiXmlElement* NextSiblingElement() const;

獲取該節(jié)點(diǎn)對(duì)應(yīng)的文本

const char* GetText() const;

設(shè)計(jì)一個(gè)ParseXML類

傳入一個(gè)xml文件路徑,就會(huì)傳出所有的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 << "無(wú)法加載xml文件!" << endl;
		cin.get();
		return false;
	}
	TiXmlElement* RootElement = Document->RootElement();		//根目錄
	TiXmlElement* NextElement = RootElement;		//根目錄下的第一個(gè)節(jié)點(diǎn)層
	while (NextElement != NULL)		//判斷有沒(méi)有讀完
	{
		if (NextElement->ValueTStr() == "menu")		//讀到menu節(jié)點(diǎn)
		{
			TiXmlElement* BoxElement = NextElement->FirstChildElement();
			while (BoxElement->ValueTStr() != "name")		//讀到name節(jié)點(diǎn)
			{
				BoxElement = BoxElement->NextSiblingElement();
			}
			pNode->name = BoxElement->GetText(); 
			BoxElement = BoxElement->NextSiblingElement();
			while (BoxElement->ValueTStr() == "food")		// 讀到food節(jié)點(diǎn)
			{
				pNode->food.push_back(BoxElement->GetText());
				BoxElement = BoxElement->NextSiblingElement();
			}
			while (BoxElement->ValueTStr() == "spices")		// 讀到spices節(jié)點(diǎn)
			{
				pNode->spices.push_back(BoxElement->GetText());
				BoxElement = BoxElement->NextSiblingElement();
			}
			while (BoxElement != nullptr && BoxElement->ValueTStr() == "step")// 讀到step節(jié)點(diǎn)
			{
				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;
}

測(cè)試結(jié)果

因?yàn)槲疫@個(gè)是QT做的ui界面,這里只需要關(guān)注內(nèi)容是否對(duì)應(yīng)即可。

到此這篇關(guān)于C++使用TinyXml實(shí)現(xiàn)讀取XMl文件的文章就介紹到這了,更多相關(guān)C++ TinyXml讀取XMl文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言中函數(shù)指針與軟件設(shè)計(jì)經(jīng)驗(yàn)總結(jié)

    C語(yǔ)言中函數(shù)指針與軟件設(shè)計(jì)經(jīng)驗(yàn)總結(jié)

    今天小編就為大家分享一篇關(guān)于C語(yǔ)言中函數(shù)指針與軟件設(shè)計(jì)經(jīng)驗(yàn)總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C語(yǔ)言中回調(diào)函數(shù)和qsort函數(shù)的用法詳解

    C語(yǔ)言中回調(diào)函數(shù)和qsort函數(shù)的用法詳解

    這篇文章主要為大家詳細(xì)介紹一下C語(yǔ)言中回調(diào)函數(shù)和qsort函數(shù)的用法教程,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下
    2022-07-07
  • 詳解C++元編程之Parser Combinator

    詳解C++元編程之Parser Combinator

    借助C++的constexpr能力,可以輕而易舉的構(gòu)造Parser Combinator,對(duì)用戶定義的字符串(User defined literal)釋放了巨大的潛力。
    2021-05-05
  • C++接口文件小技巧之PIMPL詳解

    C++接口文件小技巧之PIMPL詳解

    C++ 里面有一些慣用法(idioms),如 RAII,PIMPL,copy-swap、CRTP、SFINAE 等,今天要說(shuō)的是 PIMPL,即 Pointer To Implementation,指向?qū)崿F(xiàn)的指針,感興趣的可以了解一下
    2023-06-06
  • 用C語(yǔ)言實(shí)現(xiàn)三子棋

    用C語(yǔ)言實(shí)現(xiàn)三子棋

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)三子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++詳解如何通過(guò)模板實(shí)現(xiàn)元素的反序

    C++詳解如何通過(guò)模板實(shí)現(xiàn)元素的反序

    這篇文章主要介紹了C++中模板(Template)實(shí)現(xiàn)元素的反序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C語(yǔ)言數(shù)組入門(mén)之?dāng)?shù)組的聲明與二維數(shù)組的模擬

    C語(yǔ)言數(shù)組入門(mén)之?dāng)?shù)組的聲明與二維數(shù)組的模擬

    這篇文章主要介紹了C語(yǔ)言數(shù)組入門(mén)之?dāng)?shù)組的聲明與二維數(shù)組的模擬,數(shù)組學(xué)習(xí)的同時(shí)也要相應(yīng)理解C語(yǔ)言指針的作用,需要的朋友可以參考下
    2015-12-12
  • 詳解C++中的自動(dòng)存儲(chǔ)

    詳解C++中的自動(dòng)存儲(chǔ)

    這篇文章主要介紹了詳解C++中的自動(dòng)存儲(chǔ),幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下
    2020-09-09
  • C++基礎(chǔ)之this指針與另一種“多態(tài)”

    C++基礎(chǔ)之this指針與另一種“多態(tài)”

    this指針識(shí)別了同一個(gè)類的不同的對(duì)象,換句話說(shuō),this指針使得成員函數(shù)可以訪問(wèn)同一個(gè)類的不同對(duì)象。再深入一點(diǎn),this指針使得成員函數(shù)會(huì)因?yàn)閠his指針的不同而訪問(wèn)到了不同的成員變量
    2013-07-07
  • VC實(shí)現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法

    VC實(shí)現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法

    這篇文章主要介紹了VC實(shí)現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法,比較實(shí)用的一個(gè)特殊功能,需要的朋友可以參考下
    2014-08-08

最新評(píng)論