天天看點

tinyxml讀寫xml示例代碼

tinyxml讀寫xml示例代碼

http://www.seanyxie.com/tinyxml%E8%AF%BB%E5%86%99xml%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81/

TinyXML是一個開源的解析XML的解析庫,能夠用于C++,能夠在Windows或Linux中編譯。這個解析庫的模型通過解析XML檔案,然後在記憶體中生成DOM模型,進而讓我們很友善的周遊這棵XML樹。

DOM模型即文檔對象模型,是将整個文檔分成多個元素(如書、章、節、段等),并利用樹型結構表示這些元素之間的順序關系以及嵌套包含關系。

如下是一個XML片段:

tinyxml讀寫xml示例代碼
   <Persons>
tinyxml讀寫xml示例代碼
        <Person ID=”1″>
tinyxml讀寫xml示例代碼
            <name>周星星</name>
tinyxml讀寫xml示例代碼
            <age>20</age>
tinyxml讀寫xml示例代碼
        </Person>
tinyxml讀寫xml示例代碼
        <Person ID=”2″>
tinyxml讀寫xml示例代碼
            <name>白晶晶</name>
tinyxml讀寫xml示例代碼
            <age>18</age>
tinyxml讀寫xml示例代碼
tinyxml讀寫xml示例代碼
    </Persons>
tinyxml讀寫xml示例代碼

 在TinyXML中,根據XML的各種元素來定義了一些類:

TiXmlBase:整個TinyXML模型的基類。

TiXmlAttribute:對應于XML中的元素的屬性。

TiXmlNode:對應于DOM結構中的節點。

TiXmlComment:對應于XML中的注釋

TiXmlDeclaration:對應于XML中的申明部分,即<?versiong=”1.0″ ?>。

TiXmlDocument:對應于XML的整個文檔。

TiXmlElement:對應于XML的元素。

TiXmlText:對應于XML的文字部分

TiXmlUnknown:對應于XML的未知部分。 

TiXmlHandler:定義了針對XML的一些操作。

TinyXML是個解析庫,主要由DOM模型類(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作類(TiXmlHandler)構成。

tinyxml元件讀寫XML非常友善,相比boost更加輕便。

下面是xml讀寫的模版檔案

<?xml version="1.0" encoding="utf-8" standalone="yes" ?><savemaplist>
    <map mapid="1" name="Dota版本 v8.w3x" filename="Dota_V7.8.w3x" md5="90498B2406383B72B29D18B4DF62DC37" />
    <map mapid="2" name="Dota版本 v9.w3x" filename="Dota_V1.8.w3x" md5="91498B2406383B72B29D18B4DF62DC37" />
    <map mapid="3" name="Dota版本 v11.w3x" filename="Dota_V2.8.w3x" md5="91498B2406383B72B29D18B4DF62DC37" /></savemaplist>      

讀寫代碼

void				writeMapXmlData(){
	//save when quit
	TiXmlDocument xmlDoc;
	TiXmlDeclaration Declaration("1.0","utf-8","yes");
	xmlDoc.InsertEndChild(Declaration);

	TiXmlNode *pNode=NULL;
	TiXmlElement *pRootElm=new TiXmlElement("savemaplist");
	pNode=xmlDoc.InsertEndChild(*pRootElm);
	pRootElm=pNode->ToElement();

	TiXmlElement *pChildElm=new TiXmlElement("map");
	for(int i=0;i<m_rpgMapData_.size();++i){
		std::string u8node;
		pChildElm->SetAttribute("mapid",m_rpgMapData_.at(i).mapid);
		common::Base_W2U8(m_rpgMapData_.at(i).showmapname,u8node);
		pChildElm->SetAttribute("name",u8node.c_str());
		common::Base_W2U8(m_rpgMapData_.at(i).savename,u8node);
		pChildElm->SetAttribute("filename",u8node.c_str());
		pChildElm->SetAttribute("md5",m_rpgMapData_.at(i).md5.c_str());
		pNode=pRootElm->InsertEndChild(*pChildElm);
	}

	xmlDoc.SaveFile(L"config\\rpgmapd.xml");}      
void				initReadRpgMapXmlData(){
	m_rpgMapData_.clear();
	std::vector<rpgMapData>().swap(m_rpgMapData_);
	//first ,read xml file
	TiXmlDocument xmlStr;
	if(FALSE == xmlStr.LoadFile(_TEXT("config\\rpgmapd.xml"), TIXML_ENCODING_UTF8))
	{
		QB_error("公告資訊格式錯誤");
		return;
	}
	//	m_vecItem.clear();
	TiXmlElement* root = xmlStr.RootElement();   //TeamNews root
	if (root)
	{
		TiXmlElement*  firstNews = root->FirstChildElement(); 
		while(firstNews){
			rpgMapData item;
			std::string filename;
			filename=firstNews->Attribute("mapid");
			item.mapid	= atoi(filename.c_str());
			filename=firstNews->Attribute("name");
			common::Base_U82W(filename,item.showmapname);
			filename=firstNews->Attribute("filename");
			common::Base_U82W(filename,item.savename);
			item.md5=firstNews->Attribute("md5");
			item.haddownload=false;
			m_rpgMapData_.push_back(item);
			firstNews=firstNews->NextSiblingElement();
		}
	}
	}      

一些所需的類型

struct rpgMapData{
	int mapid;
	std::string md5;
	std::wstring showmapname;		//顯示的名稱
	std::wstring	savename;				//存盤名稱
	bool haddownload;
	rpgMapData(){
		mapid=0;
		md5 = "";
		showmapname  = L"";
		haddownload = false;
	}
	rpgMapData(int v):mapid(v) {
		md5 = "";
		showmapname  = L"";
		haddownload = false;
	}

	bool operator == (const rpgMapData& _R) const{
		return mapid == _R.mapid;
	}};      

繼續閱讀