有關TinyXML使用的簡單總結
??? 這次使用了
TinyXML
后,覺得這個東西真是不錯,于是將使用方法坐下總結來和大家分享。
????該解析庫在開源網站(
http://sourceforge.net
?)上有下載,在本Blog也提供下載(
下載TinyXML
)
???
TinyXML
是一個開源的解析
XML
的解析庫,能夠用于
C++
,能夠在
Windows
或
Linux
中編譯。這個解析庫的模型通過解析
XML
文件,然后在內存中生成
DOM
模型,從而讓我們很方便的遍歷這課
XML
樹。
???
注:DOM模型即文檔對象模型,是將整個文檔分成多個元素(如書、章、節、段等),并利用樹型結構表示這些元素之間的順序關系以及嵌套包含關系(理解html語言的讀者會很容易理解這種樹狀模型)。
???????????????
????如下是一個XML片段:
????
<Persons>
????????<Person ID="1">
????????????<name>周星星</name>
????????????<age>20</age>
????????</Person>
????????<Person ID="2">
????????????<name>白晶晶</name>
????????????<age>18</age>
????????</Person>
????</Persons>
????在TinyXML中,根據XML的各種元素來定義了一些類:
???????
TiXmlBase
:整個TinyXML模型的基類。
?????????????? ?
TiXmlAttribute
:對應于XML中的元素的屬性。
???????????????
?TiXmlNode
:對應于DOM結構中的節點。
????????????????????????
TiXmlComment
:對應于XML中的注釋。
????????????????????????
TiXmlDeclaration
:對應于XML中的申明部分,即<?versiong="1.0"??>。
????????????????????????
TiXmlDocument
:對應于XML的整個文檔。
???????????????????????
TiXmlElement
:對應于XML的元素。
????????????????????????
TiXmlText
:對應于XML的文字部分。
????????????????????????
TiXmlUnknown
:對應于XML的未知部分。?
???????
TiXmlHandler
:定義了針對XML的一些操作。
??? 那我們如何使用這些類以及他們的方法來操縱我們的XML呢?請看下面。
???
一、讀取XML(假設我們的Xml文檔中的內容與上面的Xml內容一樣)
???
//創建一個XML的文檔對象
。
??? TiXmlDocument *myDocument = new TiXmlDocument("填上你的Xml文件名");
???
myDocument->LoadFile();
???
//獲得根元素,即Persons。
??? TiXmlElement *RootElement = myDocument.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內容,即周星星;age內容,即20;ID屬性,即1。
??? cout << NameElement->FirstChild()->Value << endl;
??? cout << AgeElement->FirstChild()->Value << endl;
??? cout << IDAttribute->Value() << endl;
????
??? 看,讀取XML是不是很簡單阿,和Java的XML解析庫非常的相似,就是名字改了一下而已。
???
二、生成XML內容
???
//創建一個XML的文檔對象。
??? TiXmlDocument *myDocument = new TiXmlDocument();
???
//創建一個根元素并連接。
??? TiXmlElement *RootElement = new TiXmlElement("Persons");
??? myDocument->LinkEndChild(RootElement);
???
//創建一個Person元素并連接。
??? TiXmlElement *PersonElement = new TiXmlElement("Person");
??? RootElement->LinkEndChild(PersonElement);
???
//設置Person元素的屬性。
??? PersonElement->SetAttribute("ID", "1");
???
//創建name元素、age元素并連接。
??? TiXmlElement *NameElement = new TiXmlElement("name");
??? TiXmlElement *AgeElement = new TiXmlElement("age");
??? PersonElement->LinkEndChild(NameElement);
??? PersonElement->LinkEndChild(AgeElement);
???
//設置name元素和age元素的內容并連接。
??? TiXmlText *NameContent = new TiXmlText("周星星");
??? TiXmlText *AgeContent = new TiXmlText("20");
??? NameElement->LinkEndChild(NameContent);
??? AgeElement->LinkEndChild(AgeContent);
????
//保存到文件
????myDocument->SaveFile("要保存的xml文件名");
????這樣,便創建了一個如下的xml文件:
???
<Persons>
????????<Person ID="1">
????????????<name>周星星</name>
????????????<age>20</age>
????????</Person>
??? </Persons>
????
??? 是不是很簡單啊?在這里我只是簡單的對TinyXml的使用作了介紹,歡迎各位提問留言,我會盡力解答各位的問題。[By Lqbest]
posted on 2006-08-07 15:51 freecoder Team 閱讀(2658) 評論(15) ? 編輯 ? 收藏 所屬分類: C plus 、 XML

View Comments
#1樓 ? [樓主] ?? 回復 ?? 引用 ?? 查看 ?? ??
By Yoyo:很不錯啊,操作xml挺方便的,下次我來總結.Net中xmldocument類的用法,以跟你的tinyXml做一比較。
BTW:
1,tinyXml是個解析庫,實際上是不是相當于一個解析xml文檔的類?
2,你上面聲明的對象變量為什么都要加*,有沒有特殊含義?
3,“->”與“.”的區別是什么?
4,“<<”是什么東東?
望大哥有空賜教。
#2樓 ? [樓主] ?? 回復 ?? 引用 ?? 查看 ?? ??
@freecoder Team問題1(tinyXml是個解析庫,實際上是不是相當于一個解析xml文檔的類?
)回答:TinyXML是個解析庫,他主要有DOM模型類(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作類(TiXmlHandler)構成。它由兩個頭文件(.h文件)和四個CPP文件(.cpp文件)構成,用的時候,只要將(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)導入工程就可以用它的東西了。如果需要,可以將它做成自己的DLL來調用。
問題2(你上面聲明的對象變量為什么都要加*,有沒有特殊含義?
)回答:這個*號是C/C++中的指針聲明,相當于C#、Java中的引用。但是在C/C++中需要顯示的將這些指針釋放內存,不然會造成內存泄露。
問題3(“->”與“.”的區別是什么?)回答:“->”是指針專用,如:
“指針1->指針1所指向的對象的某個成員”;“.”是對象專用,如:
“對象1.對象1的某個成員”。這些都是C/C++中的語法。
問題4(“<<”是什么東東?)回答:在C中我們向屏幕輸出用printf,在C++中用“cout << 輸出內容”來代替printf。性能更好,使用更方便。[Lqbest]
#3樓 ? [樓主] ?? 回復 ?? 引用 ?? 查看 ?? ??
well done,thx!If we compile it to be "DLL" file,i think that we can also use it in .net environment.[Yoyo]
#4樓 ? [樓主] ?? 回復 ?? 引用 ?? 查看 ?? ??
@freecoder Teamyes. u are right. an DLL file can be used in any windows' program.[Lqbest]
#5樓 ? ?? 回復 ?? 引用 ?? 查看 ?? ??
想問一下利用這個可以進行Find查找Element嗎?#6樓 ? ?? 回復 ?? 引用 ?? 查看 ?? ??
突然問您個問題問題有些唐突,敬請您解答關于tinyxml
在VC6.0中使用,源程序使用的是多線程release編譯所以我把tinyxml下載文件夾里的tinyxml_lib.dsp也用多線程release編譯生成了tinyxmld.lib,同兩個頭文件加入到程序中加入到程序中,函數調用都正常.但每次loadfile時候都失敗,跟蹤調試發現每次loadfile都探出一個對話框讓我指定vc60.pdb的位置,制定了幾次都不對
想問問您多線程編譯是不是這樣就可以?還是我使用tinyxml方法有問題
那個對話框是怎么回事。
該指定那個?
等待著您的回答。謝謝
#7樓 ? ?? 回復 ?? 引用 ?? 查看 ?? ??
不用lib方式,直接把tinyxml的源代碼加入你的項目一起編譯就沒這些麻煩了#8樓 ? ?? 回復 ?? 引用 ?? 查看 ?? ??
你好:我希望得到一個類似下面這樣的東西
<point>
12, 34
</point>
然后,我就看源代碼,發現PutString可能可以這么做;但是卻經常出錯
首先,就是字符串轉化的問題;我的寫法是
const char *psz = "12 23";
const std::string s = std::string(psz);
newCgPoints->PutString(&s, out);
但是還是需要一步轉變成&引用型的;有沒有什么好的辦法呢?
其次,要達到我說的效果,這個API可以嗎?不可以的話,用什么呢?
#9樓 ? ?? 回復 ?? 引用 ?? 查看 ?? ??
我剛才說的辦法好像不行,但是又不曉得用什么別的辦法#11樓 ? ?? 回復 ?? 引用 ?? 查看 ?? ??
我創建了TiXmlDocument *doc = NULL;
doc = new TiXmlDocument();
TiXmlElement *XMLRoot = NULL;
XMLRoot = new TiXmlElement("Sectors");
doc->LinkEndChild(XMLRoot);
XMLRoot->SetAttribute("name", "RoadGroup");
2個對象,但是在銷毀的時候出現了中斷;我的銷毀代碼為:
if(XMLRoot)
{
delete XMLRoot;
}
if(doc)
{
delete doc;
}
#12樓 ? ?? 回復 ?? 引用 ?? 查看 ?? ??
問你個問題,就是我要從下面的字符串中將,hello和how are you解析出來,是怎么解析的啊?急啊!!!<FONT FACE="騫煎渾"><FONT COLOR="#000000">hello<br>how are you</FONT></FONT>
#13樓 ? ?? 回復 ?? 引用 ?? 查看 ?? ??
我有個問題 關于xml中的node這個概念該怎么理解,是不是所有的element 都可以看成node?#14樓 ? ?? 回復 ?? 引用 ?? 查看 ?? ??
virtual const TiXmlElement * ToElement () constCast to a more defined type. Will return null if not of the requested type.
這個函數的作用是什么啊。能解釋下么。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
