l TinyXML簡介
TinyXML是目前非常流行的一款基於DOM模型的XML解析器,簡單易用且小巧玲瓏,非常適合儲存簡單資料,設定檔,對象序列化等資料量不是很大的操作,尤其適用於遊戲開發,在Nebula2,CEGUI等開源項目中都有使用。
| 名稱 |
提供者 |
是否支援驗證 |
備忘 |
| Expat |
SAX/Local |
不清楚 |
Local指它還有一套自己訪問模型 |
| LibXML2 |
SAX/DOM |
驗證 |
|
| TinyXml |
DOM |
否 |
|
| XML4C |
SAX/DOM |
驗證 |
不過用了ICU,國際化似乎更好 |
| Xerces-C |
SAX/DOM |
驗證 |
|
| XML Booster |
Local |
不清楚 |
估計效率應該很高 |
l 關於DOM和SAX
DOM - Document Object Model
將整篇XML文檔一次性解析並讀入記憶體,儲存為一個對象供使用者訪問。
SAX - Simple API for XML
SAX的XML解析方式是基於事件回調的,解析器在每遇到一個XML元素時都會產生一個事件,並執行由使用者提供的處理函數。
l TinyXML類結構
[TiXmlBase] 所有TinyXML類的基類,儲存該結點或屬性在XML原文中的資訊。
[TiXmlAttribute] XML結點屬性,一個索引值對
[TiXmlNode] XML結點的基類,封裝了對XML文檔樹形結構進行操作和維護的方法
[TiXmlComment] XML注釋結點
[TiXmlDeclaration] XML聲明結點
[TiXmlDocument] XML文檔結點(一般為一篇XML文檔的根結點)
[TiXmlElement] XML結點
[TiXmlText] XML文本結點
[TiXmlUnknown] 含有未知標籤的XML結點
[TiXmlHandle] 封裝了一個結點的指標,在對該指標進行查詢時將自動進行null 指標交驗
[TiXmlVisitor] 遍曆器介面,描述了每個節點的處理方法,由子類實現
[TiXmlPrinter] Printer遍曆器
l 讀取XML檔案
TiXmlDocument doc("test.xml");
doc.LoadFile("test.xml");
l 寫入XML檔案
TiXmlDocument doc;
……
doc.SaveFile("test.xml");
l 遍曆XML文檔
首先以FirstChild獲得第一個自節點,然後以NextSibling擷取下個兄弟節點;如此遞迴遍曆所有節點即可。
TiXmlNode::FirstChild();
TiXmlNode::NextSibling();
l 構造XML文檔
將指定節點插入當前節點子節點隊列的末尾
TiXmlNode::LinkEndChild();
設定指定節點的屬性
TiXmlElement::SetAttribute();
TiXmlElement::SetDoubleAttribute();
TinyXML是個解析庫,主要由DOM模型類(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作類(TiXmlHandler)構成。它由兩個標頭檔(.h檔案)和四個CPP檔案(.cpp檔案)構成,用的時候,只要將(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)匯入工程就可以用它的東西了。如果需要,可以將它做成自己的DLL來調用。舉個例子就可以說明一切。
對應的XML檔案:
<Persons>
<Person ID="1">
<name>phinecos</name>
<age>22</age>
</Person>
</Persons>
讀寫XML檔案的程式碼:
#include <iostream>#include "tinyxml.h"#include "tinystr.h"#include <string>#include <windows.h>#include <atlstr.h>using namespace std;CString GetAppPath(){//擷取應用程式根目錄 TCHAR modulePath[MAX_PATH]; GetModuleFileName(NULL, modulePath, MAX_PATH); CString strModulePath(modulePath); strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('//'))); return strModulePath;}bool CreateXmlFile(string& szFileName){//建立xml檔案,szFilePath為檔案儲存的路徑,若建立成功返回true,否則false try { //建立一個XML的文檔對象。 TiXmlDocument *myDocument = new TiXmlDocument(); //建立一個根項目並串連。 TiXmlElement *RootElement = new TiXmlElement("Persons"); myDocument->LinkEndChild(RootElement); //建立一個Person元素並串連。 TiXmlElement *PersonElement = new TiXmlElement("Person"); RootElement->LinkEndChild(PersonElement); //設定Person元素的屬性。 PersonElement->SetAttribute("ID", "1"); //建立name元素、age元素並串連。 TiXmlElement *NameElement = new TiXmlElement("name"); TiXmlElement *AgeElement = new TiXmlElement("age"); PersonElement->LinkEndChild(NameElement); PersonElement->LinkEndChild(AgeElement); //設定name元素和age元素的內容並串連。 TiXmlText *NameContent = new TiXmlText("周星星"); TiXmlText *AgeContent = new TiXmlText("22"); NameElement->LinkEndChild(NameContent); AgeElement->LinkEndChild(AgeContent); CString appPath = GetAppPath(); string seperator = "//"; string fullPath = appPath.GetBuffer(0) +seperator+szFileName; myDocument->SaveFile(fullPath.c_str());//儲存到檔案 } catch (string& e) { return false; } return true;}bool ReadXmlFile(string& szFileName){//讀取Xml檔案,並遍曆 try { CString appPath = GetAppPath(); string seperator = "//"; string fullPath = appPath.GetBuffer(0) +seperator+szFileName; //建立一個XML的文檔對象。 TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str()); myDocument->LoadFile(); //獲得根項目,即Persons。 TiXmlElement *RootElement = myDocument->RootElement(); //輸出根項目名稱,即輸出Persons。 cout << RootElement->Value() << endl; //獲得第一個Person節點。 TiXmlElement *FirstPerson = RootElement->FirstChildElement(); //獲得第一個Person的name節點和age節點和ID屬性。 TiXmlElement *NameElement = FirstPerson->FirstChildElement(); TiXmlElement *AgeElement = NameElement->NextSiblingElement(); TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute(); //輸出第一個Person的name內容,即周星星;age內容,即;ID屬性,即。 cout << NameElement->FirstChild()->Value() << endl; cout << AgeElement->FirstChild()->Value() << endl; cout << IDAttribute->Value()<< endl; } catch (string& e) { return false; } return true;}int main(){ string fileName = "info.xml"; CreateXmlFile(fileName); ReadXmlFile(fileName);}