1. 程式人生 > >TinyXml 操作XML 常用操作

TinyXml 操作XML 常用操作

 原始碼下載:http://sourceforge.net/projects/tinyxml/files/
 

如下是一個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的一些操作。
    那我們如何使用這些類以及他們的方法來操縱我們的XML呢?請看下面。
    一、讀取XML(假設我們的Xml文件中的內容與上面的Xml內容一樣)
    //建立一個XML的文件物件。
    TiXmlDocument *myDocument = new TiXmlDocument("填上你的Xml檔名");
    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內容,即20;ID屬性,即1。
    cout << NameElement->FirstChild()->Value << endl;
    cout << AgeElement->FirstChild()->Value << endl;
    cout << IDAttribute->Value() << endl;
    
    看,讀取XML是不是很簡單阿,和Java的XML解析庫非常的相似,就是名字改了一下而已。
    二、生成XML內容
    //建立一個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("20");
    NameElement->LinkEndChild(NameContent);
    AgeElement->LinkEndChild(AgeContent);
    //儲存到檔案
    myDocument->SaveFile("要儲存的xml檔名");
    這樣,便建立了一個如下的xml檔案:
    <Persons>
        <Person ID="1">
            <name>周星星</name>
            <age>20</age>
        </Person>
    </Persons>

 

TinyXML入門教程
 

TinyXML入門教程 1
什麼是XML? 1
文件類 2
建立文件物件 3
輸出文件物件 3
儲存文件物件 4
返回第一個根元素 5
宣告類 5
註釋類 6
元素類 6
節點名 6
父節點 6
子節點 7
編輯子節點 7
同級節點 7
遍歷元素 8
元素屬性 8
元素函式總結 9
屬性類 10

 

什麼是XML?
XML全稱EXtensible Markup Language,翻譯為可擴充套件標記語言,簡而言之就是你可以自定義資料的標識,以此來區分各種不同的資料,以便於進行資料交換,例如html就可以理解為一種簡單的xml語言。XML檔案通常就是一個文字檔案,可以使用任何編碼

 

上圖就是我係統中一個xml檔案的圖示,使用VC2005開啟它,你可以看到如下內容:



XML也是有這幾個物件組成了,一般來說我們經常使用的類如下:
l TiXmlDocument:文件類,它代表了整個xml檔案。
l TiXmlDeclaration:宣告類,它表示檔案的宣告部分,如上圖所示。
l TiXmlComment:註釋類,它表示檔案的註釋部分,如上圖所示。
l TiXmlElement:元素類,它是檔案的主要部分,並且支援巢狀結構,一般使用這種結構來分類的儲存資訊,它可以包含屬性類和文字類,如上圖所示。
n TiXmlAttribute/TiXmlAttributeSet:元素屬性,它一般巢狀在元素中,用於記錄此元素的一些屬性,如上圖所示。
n TiXmlText:文字物件,它巢狀在某個元素內部,如上圖所示。

TinyXml使用文件物件模型(DOM)來解析xml檔案,這種模型的處理方式為在分析時,一次性的將整個XML文件進行分析,並在記憶體中形成對應的樹結構,同時,向用戶提供一系列的介面來訪問和編輯該樹結構。這種方式佔用記憶體大,但可以給使用者提供一個面向物件的訪問介面,對使用者更為友好,非常方便使用者使用。下面我們依次來介紹各個類的用法。

文件類
 

文件類代表一個XML文件,通過它,你可以儲存,載入和列印輸出文件。你可以通過以下方式載入xml文件到TiXmlDocument。

建立文件物件
l 建立一個空的文件物件,然後載入一個xml文件
使用到的函式原形如下:
+TiXmlDocument();
+bool LoadFile( const std::string& filename)
在程式中你可以如下使用:

//載入xml文件
TiXmlDocument doc();
doc.LoadFile("tutorial.xml");

l 2、在建構函式中傳入文件的名稱,然後呼叫load函式完成解析載入
使用到的函式原形如下:
+TiXmlDocument( const std::string& documentName );
+bool LoadFile();
在程式中你可以如下使用:

//載入xml文件
TiXmlDocument doc("tutorial.xml");
doc.LoadFile(); 

輸出文件物件
文件類提供了Print()函式用於在控制檯輸出當前的文件內容,這個函式的原形如下:
+void Print() const
在程式中你可以如下使用:

//載入xml文件
TiXmlDocument doc("tutorial.xml");
doc.LoadFile();
doc.Print(); //輸出文件 
tutorial.xml的內容如下:

<?xml version="1.0" standalone="yes" encoding="utf-8"?>

<!--comment 註釋-->

<element attribute="this a attribute(這是一個屬性)" int= "1" float = "3.14">
<subelement1>
   This a text(這是一個文字)
</subelement1>
<subelement2/>
<subelement3/>
<subelement4/> 
</element> 
在控制檯中你可以得到如下輸出:

由於檔案使用UTF-8編碼,而Windows下的控制檯預設使用gb2312編碼,因此會生成亂碼。



儲存文件物件
當然你也可以使用SaveFile()函式來進行另存為,這個函式的原形如下:
bool SaveFile( const std::string& filename ) const
在程式中你可以如下使用:

//載入xml文件
TiXmlDocument doc("tutorial.xml");
doc.LoadFile();
doc.Print(); //輸出文件
cout<<endl;
doc.SaveFile("tutorial.txt"); 
使用記事本開啟tutorial.txt,你可以看到如下內容。


返回第一個根元素
另外文件物件還提供了一個實用的函式用於返回第一個根物件,它可以讓你方便的遍歷整個文件結構,查詢自己需要的資料。函式原形如下:
+TiXmlElement* RootElement()
我們在介紹元素類的時候再詳細介紹它的使用。

宣告類
在標準的XML檔案中,宣告為檔案的第一項,例如<?xml version="1.0" standalone="yes"?>,宣告物件具有三個屬性值,版本,編碼和獨立檔案宣告
一般來說文件的第一行就是宣告物件,你可以把文件物件的第一個子節點轉換為宣告物件。

//使用TinyXml的宣告物件
TiXmlDeclaration *decl;
decl = doc.FirstChild()->ToDeclaration(); 
然後就可以使用它的功能了,它可以讓你返回當前的版本,編碼等資訊,函式原形如下:
+const char *Version() const
+const char *Encoding() const
+const char *Standalone() const

在程式中你可以如下使用:

//使用TinyXml的宣告物件
TiXmlDeclaration *decl;
decl = doc.FirstChild()->ToDeclaration();
cout<<"使用TinyXml的宣告物件(TiXmlDeclaration)"<<endl;
//輸出宣告物件對應的xml內容
decl->Print(0,4,&str);
cout<<str<<endl;
//分別輸出宣告物件的屬性
cout<<"版本:"<<decl->Version()<<" 是否為對立檔案:"<<decl->Standalone()<<" 編碼方式:"<<decl->Encoding()<<endl;
cout<<endl;  


註釋類
這個類一般為xml資料提供解釋說明,在程式中一般不使用它,因此,這裡就不介紹了。

元素類
元素為一個容器類,它具有元素名稱,並可以包含其它元素,文字,註釋和未知節點,這些物件統稱為元素的節點,即節點可以為元素、文字、註釋和未知節點型別。元素也可以包含任意個數的屬性。
我們還是以如下的XML程式碼來說明這個類的功能。

<element attribute="this a attribute(這是一個屬性)" int= "1" float = "3.14">
<subelement1>
   This a text(這是一個文字)
</subelement1>
<subelement2/>
<subelement3/>
<subelement4/> 
</element>

節點名
在上方元素的程式碼中,element為根元素的名稱,你可以通過如下的函式來設定和返回它。
+const std::string& ValueStr() const
+void SetValue( const std::string& _value )

父節點
subelement1,subelement2,subelement3,subelement4都是element的子元素,如果當前元素物件的指標指向subelement1,subelement2,subelement3,subelement4,你可以通過Parent()函式來返回指向element物件的指標,Parent()函式的宣告如下:
+TiXmlNode* Parent()

子節點
通過父節點的指標,你可以遍歷所有的子節點。
+TiXmlNode* FirstChild()
+TiXmlNode* FirstChild( const std::string& _value )
上面兩個函式用於返回第一個子節點物件的指標,帶引數名的那個函式表示返回第一個名為_value的子節點。

+TiXmlNode* LastChild()
+TiXmlNode* LastChild( const std::string& _value )
上面的兩個函式用於返回最後一個節點物件的指標,帶引數名的那個函式表示返回最後一個名為_value的子節點。

你也可以使用IterateChildren()函式來依次遍歷所有的節點,它們的函式宣告如下:
+TiXmlNode* IterateChildren( const TiXmlNode* previous )
+TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous )
帶引數名的那個函式表示只遍歷同名的節點。

編輯子節點
你可以插入、刪除替換所有的子節點。
+TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
+TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
+TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis );
上面三個函式用於插入節點,InsertEndChild函式讓你把新節點插入到末尾,InsertBeforeChild和InsertAfterChild函式允許你在指定的節點位置前後插入節點。

+TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
ReplaceChild函式用於替換指定的節點。

+bool RemoveChild( TiXmlNode* removeThis );
RemoveChild函式讓你刪除指定的節點。
void Clear();
Clear函式會刪除本節點的所有子節點(包括子節點包含的從子節點),但不會修改本節點。

同級節點

<element attribute="this a attribute(這是一個屬性)" int= "1" float = "3.14">
<subelement1>
   This a text(這是一個文字)
</subelement1>
<subelement2/>
<subelement3/>
<subelement4/> 
</element> 
在上面的xml程式碼中,subelement1、subelement2、subelement3、subelement4都屬於同級節點,我們也提供了相關的函式用於在這些同級節點中遍歷。

+TiXmlNode* PreviousSibling()
+TiXmlNode* PreviousSibling( const std::string& _value )
可以根據當前的節點,返回上一個節點的指標。帶引數名的那個函式表示返回上一個名為_value的節點。

當然你也可以根據當前的節點,返回下一個節點的指標。帶引數名的那個函式表示返回下一個名為_value的節點。
+TiXmlNode* NextSibling()
+TiXmlNode* NextSibling( const std::string& _value)

遍歷元素
元素是一種特殊的節點,以’<’為開始字元,後接元素名稱。函式NextSiblingElement用於返回下一個同級元素,而忽略其它型別的節點。它們的函式宣告如下:
+TiXmlElement* NextSiblingElement()
+TiXmlElement* NextSiblingElement( const std::string& _value)
帶引數名的那個函式表示返回下一個名為_value的同級元素。

本類也提供了相關的函式,讓你返回第一個子元素。
+TiXmlElement* FirstChildElement()
+TiXmlElement* FirstChildElement( const std::string& _value )
帶引數名的那個函式表示返回下一個名為_value的子元素。

元素屬性
屬性一般儲存在元素中,它們為使用“=”號連線的兩個字串,左邊的表示屬性名,等號右邊的表示屬性值,通常使用字串、整數和浮點數等資料型別表示。例如,pi = 3.14。
你可以通過如下的函式,返回屬性值。
+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個函式中,第一個函式使用字串儲存返回的屬性值,第二個函式把屬性值轉換為整數然後返回,第三個函式把屬性值轉換為浮點數然後返回。不過,第二、三個函式都會以字串的形式記錄屬性值,並作為函式的返回值返回。
另外,你也可以使用模板函式:
+template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const
來返回特點的屬性值,它會根據你傳入的引數,自動選擇合適資料型別。

另外,本類也提供瞭如下三個函式讓你設定屬性,引數的型別和返回函式類似。
+void SetAttribute( const std::string& name, const std::string& _value );
+void SetAttribute( const std::string& name, int _value );
+void SetDoubleAttribute( const char * name, double value );

FirstAttribute和LastAttribute可以讓你返回第一個和最後一個屬性,它們的函式宣告如下:
+TiXmlAttribute* FirstAttribute()
+TiXmlAttribute* LastAttribute() 
RemoveAttribute函式可以讓你刪除指定名稱的屬性,它的函式宣告如下:
+void RemoveAttribute( const std::string& name )

元素函式總結
ValueStr     //返回元素名稱
SetValue     //設定元素名稱
Parent     //返回父節點物件

FirstChild    //返回第一個子節點
LastChild     //返回最後一個子節點
IterateChildren   //返回下一個子節點

InsertEndChild   //在最後一個子節點後插入子節點
InsertBeforeChild   //在指定的子節點前插入子節點
InsertAfterChild   //在指定的子節點後插入子節點
ReplaceChild    //替換指定的子節點
RemoveChild    //刪除指定的子節點
Clear     //刪除所有的子節點

PreviousSibling   //返回同級中前一個節點
NextSibling    //返回同級中後一個節點

NextSiblingElement   //返回同級中後一個元素
FirstChildElement   //返回第一個子元素節點
Attribute     //返回元素中的屬性值
QueryValueAttribute //返回元素中的屬性值
SetAttribute    //設定元素中的屬性值
FirstAttribute   //返回元素中第一個屬性物件
LastAttribute    //返回元素中最後一個屬性物件
RemoveAttribute   //刪除元素中指定的屬性物件

屬性類
屬性為名稱="值"對,元素可以具有屬性值,但名稱必須唯一。
你可以通過
+const std::string& NameTStr() const
返回屬性名稱

也可以通過下面三個函式返回屬性值:
+const std::string& ValueStr() const
+int     IntValue() const;
</div