a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

怎么利用tinyxml操縱xml和應該注意的問題有哪些

2020-02-24 14:38:02
字體:
來源:轉載
供稿:網友

今天小編跟大家分享一下怎么利用tinyxml.html" target="_blank">xml操縱xml和應該注意的問題有哪些,感興趣的朋友跟小編一起來了解一下吧!

在上篇博客中,大概了解了tinyxml工具的架構,那這篇博客,我們詳細講述如何利用tinyxml操縱xml。以及在操作的過程中,我們應該注意的問題。
首先把tinyxml源文件導入自己的工程中,效果如下:?
????

? ? 實際上,直接添加文件到工程中:如下:
?


若您的系統是win7或office是2007以上的,添加文件這個功能是不能用的,結果是:或直接崩潰。或沒反應。解決方案如下:?
http://www.5lwq4hdr.cn/article/32996.htm
環境準備好了,那么我們開始動手操作吧。正如對數據庫表操作一樣---增刪改查。根據此邏輯,那就從增(創建)開始。
創建的格式如下:

?

?




lhy
22

?


上篇博客中,我們也介紹了tinyxml解析器中的所有的類以及類之間的關系。
創建上述格式的xml,代碼如下:

?

?


//創建一個XML的文檔對象。
TiXmlDocument *myDocument = new TiXmlDocument();
//創建一個根元素并連接。
TiXmlElement *RootElement = new TiXmlElement("Persons");
myDocument->LinkEndChild(RootElement);
//創建一個Person元素并連接。
TiXmlElement *PersonElement = new TiXmlElement("Person");
RootElement->LinkEndChild(PersonElement);
//創建name元素、age元素并連接。
TiXmlElement *NameElement = new TiXmlElement("name");
TiXmlElement *AgeElement = new TiXmlElement("age");
PersonElement->LinkEndChild(NameElement);
PersonElement->LinkEndChild(AgeElement);
//設置name元素和age元素的內容并連接。
TiXmlText *NameContent = new TiXmlText("lhy");
TiXmlText *AgeContent = new TiXmlText("22");
NameElement->LinkEndChild(NameContent);
AgeElement->LinkEndChild(AgeContent);
myDocument->SaveFile("d://lhy//xml.txt");//保存到文件


只要搞清xml中節點之間的關系,創建不是問題。說白了就是一種輩分關系。
創建搞定了,但是作為C++程序猿,寫完之后,總感覺有點別扭,總感覺哪不對勁。你是否也看出其中存在的貓膩?
對了,些許的代碼中有大量的New指針。在C++中可沒有java中的垃圾回收機制,必須自己來處理這些廢棄的垃圾。但是代碼中卻沒有Delete語句?
上網查了資料,發現很多創建代碼中,都沒有Delete語句?難道是大家都是復制粘貼?還是tinyxml在搞怪?
我總結了以下幾點,但是最后在開發的過程中仍是疑問,但是開發的過程中,沒有出現問題,所以我的程序就暫時如此了。
說法一:很多文章中,都是new沒有delete,是因為tinyxml可以自動釋放,自動銷毀指針,無需開發者手動釋放。
質疑:new出來的可以自動釋放?new出來說明是在堆上創建的,什么時候會自動釋放?程序結束時,自動釋放?那怎么判斷程序結束呢?(在一個模塊中如何析構另一個模塊中的內存區域,我們后面會詳談),所以這種說法不攻自破。
既然tinyxml中有自毀功能,那我們查詢其源代碼,發現果真如此,tinyxml中在析構函數中,有相應的指針釋放。但是并不是每個節點如此的。
源碼中的詳情:

?

?


TiXmlNode::~TiXmlNode()
{
TiXmlNode* node = firstChild;
TiXmlNode* temp = 0;
while ( node )
{
temp = node;
node = node->next;
delete temp;
}
}
void TiXmlNode::Clear()
{
TiXmlNode* node = firstChild;
TiXmlNode* temp = 0;
while ( node )
{
temp = node;
node = node->next;
delete temp;
}
firstChild = 0;
lastChild = 0;
}


我們也知道tinyxml中的類之間存在繼承關系。
那我們看tinyxml中的TixmlElement類:

?

?


TiXmlElement::~TiXmlElement()
{
ClearThis();
}
void TiXmlElement::ClearThis()
{
Clear();
while( attributeSet.First() )
{
TiXmlAttribute* node = attributeSet.First();
attributeSet.Remove( node );
delete node;
}
}


因為TixmlElement是繼承TiXmlNode.但是在TiXmlDocument中并沒有發現TiXmlDocument類的析構函數。
第二種說法:TiXmlDocument對象就是這棵樹的根結點, 在一個完整的文檔中, 除了它, 其余結點必須都是它的后代, 所以TinyXml用了一個很巧妙的方法來析構每一個結點所對應的對象 ---- 每個結點的析構任務都委托給了它的父親, 這樣只要保證父親被正確析構, 或者調用了父親的Clear函數, 它的所有后代都會被正確的析構, 所以對整個文檔來說只要TiXmlDocument對象被正確析構即可。
在創建的上述代碼中,我們發現,所有的節點都是掛在根節點之下的。
其實這句代碼: myDocument->LinkEndChild(RootElement);使用了多態方式。類之間的關系如下:
??
并且LinkEndChild源代碼如下:它是父類TiXmlNode中的方法

?

?


TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node )
{
assert( node->parent == 0 || node->parent == this );
assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() );
if ( node->Type() == TiXmlNode::DOCUMENT )
{
delete node;
if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN );
return 0;
}
node->parent = this;
node->prev = lastChild;
node->next = 0;
if ( lastChild )
lastChild->next = node;
else
firstChild = node;// it was an empty list.
lastChild = node;
return node;
}


這樣的話:則只要刪除根節點,在程序中myDocument,就相當于把刪除了TiXmlNode,相當于調用了TiXmlNode的析構函數。
質疑:網上說這種方式,析構是從葉子到樹根。根據TiXmlNode中的析構函數,我們可以得出,是從樹根到葉子。
但是我們在Delete myDocument時,應該注意一點:
創建文檔時,也就是程序段中的myDocument。若是從堆上創建,則需需要手動釋放。如我們上述的片段中,就是在堆上創建的。
TiXmlDocument *myDocument=new TiXmlDocument ();
若是從棧上創建,則不須我們手動釋放,而是程序自動調用析構函數。同時我們應該注意,其他的元素必須在堆上創建。因為在TiXmlNode析構函數中,是delete的,但是棧上的東東是不須delete,所以除了根節點之外連接的后代節點是必須從堆上創建。
經過我們解釋,明白tinyxml中的原理了嗎?只要理解了tinyxml中的類的作用以及類之間的關系,看源碼是沒問題滴哦。
這篇博客根據創建xml小demo解釋了其中存在的疑問。那下篇博客中我們會根據解析xml來答疑解析中存在的問題。

以上所述就是怎么利用tinyxml操縱xml和應該注意的問題有哪些的介紹,希望大家能夠喜歡,更多內容請繼續關注武林技術頻道網站!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: www.欧美日韩 | 亚州中文字幕 | 啪啪小视频网站 | 综合中文字幕 | 国产精品视频免费观看 | 久热伊人 | 中文一区 | 国产高清在线精品一区二区三区 | 中文字幕一区二区三区精彩视频 | 日韩另类在线 | 国产在线精品一区二区三区 | 日日夜夜免费精品视频 | 波多野结衣电影一区 | 欧美日韩中文国产一区发布 | 国产福利在线免费 | 国产精品久久久久久久久久免费看 | 狠狠爱天天操 | 一级片在线观看 | 欧美.com | 极品视频在线 | 日本超碰在线 | www视频在线观看 | 99久久99久久精品国产片果冻 | 黄的视频网站 | 国产精品久久久久久久久久10秀 | 国产午夜精品一区二区三区 | 97人人做人人人难人人做 | 日韩成人午夜 | 色图综合 | 国产传媒一区 | 久久三区| 国产不卡一区在线观看 | 日韩经典一区 | 成人国产精品入麻豆 | 91福利视频导航 | 欧美日韩综合精品 | 国产精品一区二区在线 | 亚洲成a人v欧美综合天堂麻豆 | 亚洲高清久久 | 国产精品美女久久久久久久久久久 | 日韩在线观看视频一区二区 |