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;
+ double    DoubleValue()  const;

當然你也可以設置屬性值,它們的函數聲明如下:
+ void SetName(  const std:: string& _name )
+ void SetIntValue(  int _value ); 
+ void SetDoubleValue(  double _value );
+ void SetValue(  const std:: string& _value )
以上函數與元素類中的相關函數類似,這里不重復介紹了。

在元素屬性中,通常具有許多屬性,你可以通過Next函數返回下一個屬性對象的指針,也可以通過Previous函數獲得上一個屬性對象的指針。它們的函數聲明如下:
+TiXmlAttribute* Next()
+TiXmlAttribute* Previous()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM