tinyxml使用指導

tinyxml使用指導       

 

TinyXML是一個簡單小巧,可以很容易集成到其它程序中的C++ XML解析器。

它能做些什麼

簡單地說,TinyXML解析一個XML文檔並由此生成一個可讀可修改可保存的文檔對象模型(DOM)。

XML的意思是“可擴展標記語言“(eXtensible Markup Language)。它允許你創建你自己的文檔標記。在爲瀏覽器標記文檔方面HTML做得很好,然而XML允許你定義任何文檔標記,比如可以爲一個組織者應用程序定義一個描述“to do”列表的文檔。 XML擁有一個結構化並且方便的格式,所有爲存儲應用程序數據而創建的隨機文件格式都可以用XML代替,而這一切只需要一個解析器。

最全面正確的說明可以在http://www.w3.org/TR/2004/REC-xml-20040204/找到,但坦白地說,它很晦澀難懂。事實上我喜歡http://skew.org/xml/tutorial上關於XML的介紹。

有不同的方法可以訪問和與XML數據進行交互。TinyXML使用文檔對象模型(DOM),這意味着XML數據被解析成一個可被瀏覽和操作的C++對象,然後它可以被寫到磁盤或者另一個輸出流中。你也可以把C++對象構造成一個XML文檔然後把它寫到磁盤或者另一個輸出流中。

TinyXML被設計得容易快速上手。它只有兩個頭文件和四個cpp文件。只需要把它們簡單地加到你的項目中就行了。有一個例子文件——xmltest.cpp來引導你該怎麼做。

TinyXML以Zlib許可來發布,所以你可以在開源或者商業軟件中使用它。許可證更具體的描述在每個源代碼文件的頂部可以找到。

TinyXML在保證正確和恰當的XML輸出的基礎上嘗試成爲一個靈活的解析器。TinyXML可以在任何合理的C++適用系統上編譯。它不依賴於異常或者運行時類型信息,有沒有STL支持都可以編譯。TinyXML完全支持UTF-8編碼和前64k個字符實體(<i>譯註:如果你不明白這句譯文,可能你需要了解一下Unicode編碼</i>)。

它無法做些什麼

TinyXML不解析不使用DTDs(文檔類型定義)或者XSLs(可擴展樣式表語言)。有其它解析器(到www.sourceforge.org搜索一下XML)具有更加全面的特性,但它們也就更大,需要花更長的時間來建立你的項目,有更陡的學習曲線,而且經常有一個更嚴格的許可協議。如果你是用於瀏覽器或者有更復雜的XML需要,那麼TinyXML不適合你。

下面的DTD語法在TinyXML裏是不做解析的:

<!DOCTYPE Archiv [
< !ELEMENT Comment (#PCDATA)>
]>

因爲TinyXML把它看成是一個帶着非法嵌入!ELEMENT結點的!DOCTYPE結點。或許這在將來會得到支持。

指南

有耐性些,這是一份能很好地指導你怎麼開始的指南,它(非常短小精悍)值得你花時間完整地讀上一遍。

元素類

元素爲一個容器類,它具有元素名稱,並可以包含其它元素,文本,註釋和未知節點,這些對象統稱爲元素的節點,即節點可以爲元素、文本、註釋和未知節點類型。元素也可以包含任意個數的屬性。

我們還是以如下的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函數讓你把新節點插入到末尾,InsertBeforeChildInsertAfterChild函數允許你在指定的節點位置前後插入節點。

+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 );

FirstAttributeLastAttribute可以讓你返回第一個和最後一個屬性,它們的函數聲明如下:

+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()

發佈了56 篇原創文章 · 獲贊 5 · 訪問量 81萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章