最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用tinyxml操縱xml及注意問題

 更新時間:2013年01月03日 12:10:19   作者:  
這篇博客,我們詳細講述如何利用tinyxml操縱xml。以及在操作的過程中,我們應(yīng)該注意的問題
在上篇博客中,大概了解了tinyxml工具的架構(gòu),那這篇博客,我們詳細講述如何利用tinyxml操縱xml。以及在操作的過程中,我們應(yīng)該注意的問題。
首先把tinyxml源文件導(dǎo)入自己的工程中,效果如下: 
    
    實際上,直接添加文件到工程中:如下:
 

若您的系統(tǒng)是win7或office是2007以上的,添加文件這個功能是不能用的,結(jié)果是:或直接崩潰?;驔]反應(yīng)。解決方案如下: 
http://m.fzitv.net/article/32996.htm
環(huán)境準(zhǔn)備好了,那么我們開始動手操作吧。正如對數(shù)據(jù)庫表操作一樣---增刪改查。根據(jù)此邏輯,那就從增(創(chuàng)建)開始。
創(chuàng)建的格式如下:
復(fù)制代碼 代碼如下:

<Persons>
<Person>
<name>lhy</name>
<age>22</age>
</Person>
</Persons>

上篇博客中,我們也介紹了tinyxml解析器中的所有的類以及類之間的關(guān)系。
創(chuàng)建上述格式的xml,代碼如下:
復(fù)制代碼 代碼如下:

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

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

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中的類之間存在繼承關(guān)系。
那我們看tinyxml中的TixmlElement類:
復(fù)制代碼 代碼如下:

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

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

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;
}

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

相關(guān)文章

  • 深入探討linux下進程的最大線程數(shù)、進程最大數(shù)、進程打開的文件數(shù)

    深入探討linux下進程的最大線程數(shù)、進程最大數(shù)、進程打開的文件數(shù)

    本篇文章是對linux下進程的最大線程數(shù)、進程最大數(shù)、進程打開的文件數(shù)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Visual?Studio?2022下載及配置OpenCV4.5.5的詳細過程

    Visual?Studio?2022下載及配置OpenCV4.5.5的詳細過程

    這篇文章主要介紹了Visual?Studio?2022下載及配置OpenCV4.5.5的詳細過程,在這里注意下Win10的64位操作系統(tǒng),在OpenCV官網(wǎng)下載OpenCV4.5.5,安裝的是Win?pack,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • C++基于人工智能搜索策略解決農(nóng)夫過河問題示例

    C++基于人工智能搜索策略解決農(nóng)夫過河問題示例

    這篇文章主要介紹了C++基于人工智能搜索策略解決農(nóng)夫過河問題,簡單描述了農(nóng)夫過河問題的概念、實現(xiàn)原理并結(jié)合具體實例形式給出了C++使用人工智能搜索策略解決農(nóng)夫過河問題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • Qt服務(wù)應(yīng)用操作之JSON文件操作方法

    Qt服務(wù)應(yīng)用操作之JSON文件操作方法

    在Qt框架中,處理JSON數(shù)據(jù)包括解析、生成、保存和讀取文件等操作,本文詳細介紹了這些操作的關(guān)鍵類和方法,如QJsonDocument、QJsonObject、QJsonArray等,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • QT實現(xiàn)貪吃蛇游戲

    QT實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細介紹了QT實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++在vscode中的多文件編程問題解讀

    C++在vscode中的多文件編程問題解讀

    這篇文章主要介紹了C++在vscode中的多文件編程問題解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C++ 程序員為什么看不起php程序員

    C++ 程序員為什么看不起php程序員

    由于當(dāng)今市場狀況,各種培訓(xùn)班飛起,PHPer越來越多,學(xué)習(xí)成本很低。導(dǎo)致了很多人對PHP的誤解。其實PHP學(xué)到深入的時候,所需知識很多,并不是表面看到的那樣。另外,PHP確實嚴謹性不高,這個跟C++,java確實都沒法比。但是,PHP在web開發(fā)中的效率,是其他語言所不能比的
    2017-02-02
  • C語言進階之內(nèi)存操作函數(shù)詳解

    C語言進階之內(nèi)存操作函數(shù)詳解

    這篇文章主要為大家學(xué)習(xí)介紹了C語言中內(nèi)存操作函數(shù)(memcpy、memmove和memcmp)的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-07-07
  • C++中rapidjson將嵌套map轉(zhuǎn)為嵌套json的講解

    C++中rapidjson將嵌套map轉(zhuǎn)為嵌套json的講解

    今天小編就為大家分享一篇關(guān)于C++中rapidjson將嵌套map轉(zhuǎn)為嵌套json的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C語言中的正則表達式使用示例詳解

    C語言中的正則表達式使用示例詳解

    正則表達式是使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串。本文通過示例代碼給大家介紹了C語言中的正則表達式使用,感興趣的朋友跟隨小編一起看看吧
    2019-07-07

最新評論

和林格尔县| 三江| 广水市| 衡阳市| 房产| 墨玉县| 博湖县| 灵台县| 金塔县| 楚雄市| 桃江县| 洞头县| 广宗县| 藁城市| 清镇市| 嘉祥县| 兴和县| 如东县| 阜平县| 马关县| 仁化县| 江山市| 娱乐| 大连市| 凉山| 长岛县| 临夏县| 双牌县| 且末县| 浙江省| 乌鲁木齐市| 高清| 新乡市| 搜索| 广宁县| 镇原县| 呼和浩特市| 行唐县| 湖北省| 阆中市| 高雄县|