最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2023年06月27日 11:22:32   作者:林夕07  
常見C/C++?XML解析器有Tinyxml、XERCES、squashxml、xmlite、pugxml、libxml等等,本文為大家介紹的是使用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 指可擴展標記語言( EX tensible M arkup L anguage)
  • XML 是一種 標記語言 ,很類似 HTML

格式示例

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

標簽必須成對出現(xiàn),有開始標簽就需要有結(jié)束標簽,例如:

**開始標簽:<name>

結(jié)束標簽:</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++中賦值,關(guān)系,函數(shù)調(diào)用運算符重載的實現(xiàn)

    詳解C++中賦值,關(guān)系,函數(shù)調(diào)用運算符重載的實現(xiàn)

    本文主要為大家講解一下三個C++中的運算符重載,分別是賦值運算符重載、關(guān)系運算符重載和函數(shù)調(diào)用運算符重載,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-06-06
  • Matlab實現(xiàn)將圖像序列合并為視頻的方法詳解

    Matlab實現(xiàn)將圖像序列合并為視頻的方法詳解

    MATLAB是一種高性能語言,用于操縱矩陣、執(zhí)行技術(shù)計算、繪圖等。它代表矩陣實驗室。借助這個軟件,我們可以從圖像中創(chuàng)建視頻。這篇文章主要介紹了Matlab實現(xiàn)將圖像序列合并為視頻的四個方法,希望對大家有所幫助
    2023-03-03
  • C語言宏定義的擴展定義講解

    C語言宏定義的擴展定義講解

    這篇文章主要介紹了C語言宏定義的擴展,宏定義是C語言提供的三種預處理功能的其中一種,這三種預處理包括:宏定義、文件包含、條件編譯
    2022-12-12
  • C++智能指針詳解

    C++智能指針詳解

    從比較簡單的層面來看,智能指針是RAII(Resource Acquisition Is Initialization,資源獲取即初始化)機制對普通指針進行的一層封裝。這樣使得智能指針的行為動作像一個指針,本質(zhì)上卻是一個對象,這樣可以方便管理一個對象的生命周期
    2022-08-08
  • 如何基于C語言socket編程實現(xiàn)TCP通信

    如何基于C語言socket編程實現(xiàn)TCP通信

    本文介紹了如何基于C語言socket編程實現(xiàn)TCP通信,下面小編來簡單介紹下
    2019-05-05
  • DLL加載設(shè)置相對路徑的方法

    DLL加載設(shè)置相對路徑的方法

    這篇文章給大家介紹了DLL加載設(shè)置相對路徑的方法,非常不錯,具有一定的參考借鑒加載,需要的朋友參考下吧
    2018-08-08
  • opencv2基于SURF特征提取實現(xiàn)兩張圖像拼接融合

    opencv2基于SURF特征提取實現(xiàn)兩張圖像拼接融合

    這篇文章主要為大家詳細介紹了opencv2基于SURF特征提取實現(xiàn)兩張圖像拼接融合,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++設(shè)計模式之橋接模式

    C++設(shè)計模式之橋接模式

    這篇文章主要介紹了C++設(shè)計模式之橋接模式,本文講解了什么是橋接模式、為什么要使用橋接模式、什么時候使用橋接模式等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Matlab實現(xiàn)帶豎線散點的核密度圖的繪制

    Matlab實現(xiàn)帶豎線散點的核密度圖的繪制

    核密度估計是用于估計隨機變量概率密度函數(shù)的一種非參數(shù)方法。核密度圖不失為一種用來觀察連續(xù)型變量分布的有效方法。本文將用Matlab實現(xiàn)帶豎線散點的核密度圖的繪制,感興趣的可以了解一下
    2022-08-08
  • C語言的循環(huán)小練習詳解

    C語言的循環(huán)小練習詳解

    這篇文章主要為大家介紹了C語言的循環(huán)小練習,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論

江北区| 金秀| 绥中县| 威宁| 西青区| 丽江市| 潞城市| 威信县| 曲阜市| 噶尔县| 正阳县| 临湘市| 堆龙德庆县| 舒城县| 自贡市| 即墨市| 万安县| 紫金县| 信宜市| 扬州市| 新源县| 凯里市| 从化市| 南和县| 交城县| 惠州市| 于田县| 长乐市| 兴和县| 休宁县| 南皮县| 郁南县| 拜城县| 定远县| 遂平县| 信丰县| 调兵山市| 镇远县| 灵川县| 昌乐县| 旬邑县|