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片段:
<Persons>
<Person ID=”1″>
<name>周星星</name>
<age>20</age>
</Person>
<Person ID=”2″>
<name>白晶晶</name>
<age>18</age>
</Person>
</Persons>
在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; }};