1.下載TinyXml www.sourceforge.net/projects/tinyxml
2.下載後,將
tinystr.cpp
tinystr.h
tinyxml.cpp
tinyxml.h
tinyxmlerror.cpp
tinyxmlparser.cpp
這6個文件
移動到 Classes裏面
3.編寫測試:
- #include "ParseXMLLayer.h"
- #include "tinyxml.h"
- ParseXMLLayer::~ParseXMLLayer(){
- }
- void ParseXMLLayer::onEnter(){
- CCLayer::onEnter();
- TiXmlDocument* myDocument = new TiXmlDocument(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("test.xml"));
- myDocument->LoadFile();
- TiXmlElement* rootElement = myDocument->RootElement(); // Class
- TiXmlElement* studentsElement = rootElement->FirstChildElement(); // Students
- TiXmlElement* studentElement = studentsElement->FirstChildElement(); // student
- while (studentElement) {
- TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute(); //獲得student的name屬性
- while ( attributeOfStudent ) {
- CCLOG("%s : %s",attributeOfStudent->Name(),attributeOfStudent->Value());
- // std::cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;
- attributeOfStudent = attributeOfStudent->Next();
- }
- TiXmlElement* phoneElement = studentElement->FirstChildElement();//獲得student的phone元素
- CCLOG("phone : %s",phoneElement->GetText());
- // std::cout << "phone" << " : " << phoneElement->GetText() << std::endl;
- TiXmlElement* addressElement = phoneElement->NextSiblingElement();
- CCLOG("address : %s",addressElement->GetText());
- // std::cout << "address" << " : " << phoneElement->GetText() << std::endl;
- studentElement = studentElement->NextSiblingElement();
- }
- delete myDocument;
- }
test.xml如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <Class name="計算機軟件班">
- <Students>
- <student name="張三" studentNo="13031001" sex="男" age="22">
- <phone>88208888</phone>
- <address>西安市太白南路二號</address>
- </student>
- <student name="李四" studentNo="13031002" sex="男" age="20">
- <phone>88206666</phone>
- <address>西安市光華路</address>
- </student>
- </Students>
- </Class>
關於TinyXML基本使用:
XML文檔的結構:
TinyXml實現的時DOM訪問模型,主要類間的關係如下圖所示:
TiXmlBase:其他類的基類,是個抽象類
TiXmlNode:表示一個節點,包含一般方法,如訪問自節點、兄弟節點、編輯自身、編輯子節點
TiXmlDocument:表示整個XML文檔,不對應其中某個特定的節點。
TiXmlElement:表示元素節點,可以包含子節點和TiXmlAttribute
TiXmlComment:表示註釋
TiXmlDeclaration:表示聲明
TiXmlText:表示文本節點
TiXmlUnknown:表示未知節點,通常是出錯了
TiXmlAttribute:表示一個元素的屬性
對於一個如下結構的.XML文檔,操作如下
- <Persons>
- <Person ID="1">
- <name>周星星</name>
- <age>20</age>
- </Person>
- <Person ID="2">
- <name>白晶晶</name>
- <age>18</age>
- </Person>
- </Persons>
1.創建一個XML的文檔對象
- TiXmlDocument *myDocument = new TiXmlDocument("填上你的Xml文件名");//可以有(相對)路徑
- myDocument->LoadFile();
2.獲得根元素,即Persons
- TiXmlElement *RootElement = myDocument.RootElement();
- cout << RootElement->Value() << endl; //輸出根元素名稱,即輸出Persons。
3.獲得第一個Person節點,就第一個子結點 ,若不TiXmlEelement的,用FirstChild()
- TiXmlElement *FirstPerson = RootElement->FirstChildElement();
4.獲得第一個Person的name節點和age節點和ID屬性
- TiXmlElement *NameElement = FirstPerson->FirstChildElement();
- TiXmlElement *AgeElement = NameElement->NextSiblingElement();
- TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
5.指向下一個同級的結點 用NextSiblingElement();
就是指向下一個兄弟節點
6.輸出第一個Person的內容,即周星星;即20;ID屬性1。這裏的NameElement只是指向 <name>,nameElement->value()就是 name ,
而不是周星星,“周星星”是一個文本格式的結點,而要NameElement->FirstChild()來指向它
- cout << NameElement->FirstChild()->Value() << endl;
- cout << AgeElement->FirstChild()->Value ()<< endl;
- cout << IDAttribute->Value() << endl;
7.創建一個XML的文檔對象
- TiXmlDocument *myDocument = new TiXmlDocument();
8.創建一個根元素並連接
- TiXmlElement *RootElement = new TiXmlElement("Persons");
- myDocument->LinkEndChild(RootElement);
9.創建一個Person元素並連接
- TiXmlElement *PersonElement = new TiXmlElement("Person");
- RootElement->LinkEndChild(PersonElement);
10.設置Person元素的屬性
- PersonElement->SetAttribute("ID", "1");
11.創建name元素、age元素並連接
- TiXmlElement *NameElement = new TiXmlElement("name");
- TiXmlElement *AgeElement = new TiXmlElement("age");
- PersonElement->LinkEndChild(NameElement);
- PersonElement->LinkEndChild(AgeElement);
12.設置name元素和age元素的內容並連接
- TiXmlText *NameContent = new TiXmlText("周星星");
- TiXmlText *AgeContent = new TiXmlText("20");
- NameElement->LinkEndChild(NameContent);
- AgeElement->LinkEndChild(AgeContent);
13.保存到文件
- myDocument->SaveFile("要保存的xml文件名");
這樣,便創建了一個如下的xml文件:
<Persons>
<Person ID="1">
<name>周星星</name>
<age>20</age>
</Person>
</Persons>
14.刪除一個結點 void ParentEelement->RemoveChild(指定的子結點)
刪除所有的子結點void ParentEelement->Clear()
15.返回第一個子結點
<結點類型> ParentEelement->FirstChild();//或是FirstChildElement();(確定子結點爲TiXmlElement類型用)
16.返回最後一個子結點
<結點類型> ParentEelement->LastChild();//或是LastChildElement();(確定子結點爲TiXmlElement類型用)
17.返回同級的後一個結點
<結點類型> Eelement->NextSibling();//或是NextSiblingElement();(確定後一結點爲TiXmlElement類型用)
18.返回同級的前一個結點
<結點類型> Eelement->PreviousSibling();//或是PreviousSiblingElement();(確定後一結點爲TiXmlElement類型用)
19.替換指定的子結點
ParentElement->ReplaceChild("要替換的子結點","新的結點");
20.返回結點的父結點
<結點類型> ChildElement -> Parent();
21屬性類
屬性爲名稱="值"對,元素可以具有屬性值,但名稱必須唯一。
你可以通過
+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()
以上就是TinyXML的一些常的操作方法。
擴展:使用TinyXml庫值得注意的問題
http://blog.csdn.net/hoyt00/article/details/6769883