1. 程式人生 > >Windows Tinyxml讀取xml檔案小結

Windows Tinyxml讀取xml檔案小結

TinyXML是一個開源的解析XML的解析庫,能夠用於C++,能夠在Windows或Linux中編譯。這個解析庫的模型通過解析XML檔案,然後在記憶體中生成DOM模型,從而讓我們很方便的遍歷這棵XML樹。DOM模型即文件物件模型,是將整個文件分成多個元素(如書、章、節、段等),並利用樹型結構表示這些元素之間的順序關係以及巢狀包含關係。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)匯入工程就可以用它的東西了,這裡我把這四個cpp檔案做成了靜態庫libtinyxml.a,使用的時候只在工程中需包含靜態庫和兩個標頭檔案。

如何析 xml 文件,一般是這樣的:

1 載入 xml

2 獲得根元素

3 獲取任意一個元素

4 對元素進行解析。 

1、載入 xml 載入 xml 首先必須得建立一個文件物件,文件類有下面幾種建構函式

TiXmlDocument();//Create a document with a name. The name of the document is also the filenameof the xml.

TiXmlDocument(const char * documentName );

通過檔案載入 有了文件物件後可以載入檔案,載入檔案的函式原型為

boolLoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );

boolLoadFile(const char*filename,TiXmlEncoding encoding=TIXML_DEFAULT_ENCODING );

通過字串載入也可以通過載入 xml 字串 ,函式原型為:

virtualconst char* Parse( const char* p, TiXmlParsingData*data=0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING );

TiXmlParsingData*data 這個引數不知道有什麼用,預設使用了沒問題

文件物件的四個成員函式

voidPrint() const 輸出到

控制檯視窗

boolSaveFile( const std::string& filename ) const;儲存文件到指定檔名

constchar * ErrorDesc() const;//用來輸出錯誤說明 

2獲得根元素 通過上一步載入的文件物件來獲取跟元素,下面是獲取根元素的函式原型: 

TiXmlElement* RootElement() ; 

doc.RootElement();//通過文件物件獲取跟元素;

3獲取任意一個元素通過上一步獲取的根元素物件可以獲取文件中的任意一個元素物件,主要通過以下函式:

下面兩個函式,返回第一個子元素。

TiXmlElement*FirstChildElement();

TiXmlElement*FirstChildElement( const std::string&_value )

帶引數名的那個函式表示返回下一個名為_value 的子元素。

下面兩個函式返回當前元素的下一個元素

TiXmlElement*NextSiblingElement()

TiXmlElement*NextSiblingElement( const std::string& _value)

帶引數名的那個函式表示返回下一個名為_value 的同級元素。

4、對元素進行解析通過上一步獲取的元素物件,可以實現元素的解析,分為三部分對元素進行解析

獲取元素屬性值:如下的函式,返回屬性值。

const std::string* Attribute( const std::string& name) const;

const std::string* Attribute( const std::string&name, int* i ) const; 

const std::string*Attribute( const std::string& name,double*d ) const;

在上面 3 個函式中,第一個函式使用字串儲存返回的屬性值,第二個函式把屬性值轉換為整數然後返回,第三個函式把屬性值轉換為浮點數然後返回。不過,第二、三個函式都會以字串的形式記錄屬性值,並作為函式的返回值返回。

舉例分析 對 xml 進行解析一般使用 FirstChildElement,NextSiblingElement,GetText(), Attribute()這四個函式就足夠了。

它們都是通過 TiXmlElement 型別的物件進行呼叫

FirstChildElement();獲取父元素的第一個子元素

FirstChildElement(“name”)獲取父元素第一個名為 name 的子元素

NextSiblingElement();獲取當前元素的下一個元素

NextSiblingElement(“name”)獲取當前元素的下一個第一個名為 name 的元素

GetText();獲取當前元素的值

Attribute(“name”);獲取當前元素名為 name 的屬性的值


如下是一個 XML 片段:我們以這個例子為例進行解析。

注意:獲取每個元素後最好要檢查這個元素是否為空,此為測試程式為使程式更清晰就沒有寫

//sample.xml//

<Persons>這是個元素

<Person ID="1"> 子元素,ID 為該元素的屬性,用 Attribute()獲取

<name>周星星</name> 子元素,周星星為該元素的值,用 GetText()獲取

<age>20</age> 下一個元素

</Person>

<Person ID="2">

<name>白晶晶</name>

<age>18</age>

</Person>

</Persons>

#include<iostream>

#include"tinyxml.h"

#include"tinystr.h"

include<string>

usingnamespace std;

int main()

{ //建立一個 XML 的文件物件

TiXmlDocument *myDocument = newTiXmlDocument("sample.xml"); 

myDocument->LoadFile();//獲得根元素,即 Persons

TiXmlElement *RootElement = myDocument->RootElement();//person1 通過父元素獲取第一個名為 Person 的元素

TiXmlElement*Person1=RootElement->FirstChildElement("Person"); //獲取名為 ID 的元素屬性

cout<<Person1->Attribute("ID")<<endl;//通過父元素獲取第一個名為 name 的元素

TiXmlElement * name1 = Person1->FirstChildElement("name"); //獲取元素文字

cout<<name1->GetText()<<endl;

TiXmlElement * age1 = Person1->FirstChildElement("age");

cout<<age1->GetText()<<endl;//通過 Person1獲取它下一個第一個為person的元素

TiXmlElement *Person2= Person1->NextSiblingElement("Person");

cout<<Person2->Attribute("ID")<<endl;

TiXmlElement * name2 = Person2->FirstChildElement("name");cout<<name2->GetText()<<endl;

TiXmlElement * age2 =Person2->FirstChildElement("age"); cout<<age2->GetText()<<endl;

TiXmlHandle docHandle(myDocument);// myDocument 為一個文件物件的指標 

TiXmlElement*name=docHandle.FirstChild("Persons").Child("Person",1).FirstChild("name").Element();

cout<<name->Value()<<":"<<name->GetText()<<endl;

delete myDocument;

myDocument=NULL;

return 0;

}