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函數讓你把新節點插入到末尾,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()
轉載于:https://www.cnblogs.com/lgh1992314/archive/2013/03/30/5835151.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的tinyxml使用指导的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java_IO_File(3)_遍历、递
- 下一篇: 谈谈我工作的经历