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()
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/shangguanwaner/archive/2009/01/28/3853904.aspx