2009年3月10日 星期二

TinyXml - 快速上手

TinyXml是一個小巧好用的C++ XML Parser Library, 原始檔只有6個程式:
tinystr.cpp
tinyxml.cpp
tinyxmlerror.cpp
tinyxmlparser.cpp
tinystr.h
tinyxml.h

TinyXml是屬於DOM類型,不技援驗証的解析器。

TinyXml的關係類別簡介:
TiXmlBase - 最基本的抽象類別
TiXmlNode - 代表 XML 裡的節點,所有其它型態的資料都是繼承此類別
TiXmlDocument - 整個 XML 可以視為一個文件
TiXmlElement - 代表元素節點,可包含子節點及屬性
TiXmlComment - 代表注解
TiXmlDeclaration - 代表 XML 的聲明
TiXmlText - 代表元素節點內的本文節點
TiXmlUnknown - 代表未知節點,通常代表 XML 有錯誤了
TiXmlAttribute - 代表元素的屬性

一、讀取XML檔案
假設有一XML檔案personInfo.xml,內容為:
<?xml version=\"1.0\"?>
<Persons>
<Person ID="1">
<name>Hedy</name>
<age>15</age>
</Person>
<Person ID="2">
<name>Jan</name>
<age>30</age>
</Person>
</Persons>


//產生一個XML的文檔物件。
TiXmlDocument* xmlDoc = new TiXmlDocument(“personInfo.xml”);
xmlDoc->LoadFile();
//獲得根元素,即Persons。
TiXmlElement *rootElement = xmlDoc.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內容,即Hedy;age內容,即15;ID屬性,即1。
cout << nameElement->FirstChild()->Value << endl;
cout << ageElement->FirstChild()->Value << endl;
cout << IDAttribute->Value() << endl;


二、讀取XML自Char
讀取xml文字,其實跟讀xml檔案沒什麼差別,但使用到的是 Parse()這個function。
Const char* xmlStr =
“<?xml version=\"1.0\"?>\n” +
“<Persons>\n” +
“<Person ID=\"1\">\n” +
“<name>Hedy</name>\n” +
“<age>15</age>\n” +
“</Person>\n” +
“<Person ID=\"2\">\n” +
“<name>Jan</name>\n” +
“<age>30</age>\n” +
“</Person>\n” +
“</Persons>\n”;

TiXmlDocument xmlDoc;
xmlDoc.Parse(xmlStr);

其他的操作方式就跟讀xml檔是一樣的。

三、產生XML
//產生一個XML的文檔物件。
TiXmlDocument xmlDoc;
//產生XML聲明並連接到 xmlDoc
TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );
xmlDoc->LinkEndChild( decl );
//產生一個根元素並連接到 xmlDoc
TiXmlElement *rootElement = new TiXmlElement("Persons");
xmlDoc->LinkEndChild(rootElement);
//產生一個Person元素並連接到 rootElement
TiXmlElement *personElement = new TiXmlElement("Person");
rootElement->LinkEndChild(personElement);
//設置Person元素的屬性。
personElement->SetAttribute("ID", "1");
//產生name元素、age元素並連接到 persionElement
TiXmlElement *nameElement = new TiXmlElement("name");
TiXmlElement *ageElement = new TiXmlElement("age");
personElement->LinkEndChild(nameElement);
personElement->LinkEndChild(ageElement);
//設置name元素和age元素的內容並連接到 nameElement 跟 ageElement
TiXmlText *nameContent = new TiXmlText("Hedy");
TiXmlText *ageContent = new TiXmlText("15");
nameElement->LinkEndChild(nameContent);
ageElement->LinkEndChild(ageContent);
//存到一個自訂的XML檔案
xmlDoc->SaveFile("personInfo.xml");

產生:
<Persons>
<Person ID="1">
<name>Hedy</name>
<age>15</age>
</Person>
</Persons>