關於tinyxml的剖析及遍歷

2021-05-23 17:19:02 字數 1684 閱讀 5661

下面是名為 example.xml的文件,後續的剖析都會以這個xml文件為例:

(1)tinyxml把xml文件建立成一棵dom(document object model)樹,具體實現用的是firstchild–nextsibling tree,下面是對該樹的模型的乙個簡單介紹:

firstchild-nextsibling是一種多叉樹常用的實現方法,每個結點只需要知道它的第乙個孩子結點(first child node)和它的下乙個兄弟結點(next sibling node),這樣一整棵樹的結構就會建立起來,也可以用根結點的指標為起點來對整棵樹進行遍歷。在tinyxml中,每個結點儲存了它的first child, last child,  next sibling, previous sibling, parent這五個與它相關的結點的指標,這樣便可提供更加方便的遍歷介面。下面是對上面的example.xml的內容所建立的dom樹:

上圖中 藍色的指向first child, 紅色的指向last child, 綠色的指向next sibling, 紫色的指向previoud sibling, 黑色的指向parent

(2)tinyxml 把一篇xml文件裡的各個元素抽象成如下圖所示的物件:

example.xml文件和上面定義的物件可以得到如下的對應關係:

#include

#include 「tinyxml.h」

using namespace std;

void paraseupdatexml(tixmlnode* pparent);

int main()

tixmldocument doc(」abc.xml」);

doc.loadfile();

tixmlelement* root = doc.rootelement();

if(!root) return 1;

paraseupdatexml(root);

return 0;

void paraseupdatexml(tixmlnode* pparent)

if(pparent == null)

return;

tixmlnode* pchild = pparent->firstchild();

while(pchild)

cout << pchild->value() << 」 「;

int t = pchild->type();

if( t == tixmlnode::element)

tixmlattribute* attr = pchild->toelement()->firstattribute();

if(attr)

tixmlnode* node = pchild;

while(node)

while(attr)

cout << 」 」 << attr->name() << 「=」 << attr->value();

attr = attr->next();

cout << endl;

node =  node->nextsiblingelement();

paraseupdatexml(pchild);

else if( t == tixmlnode::text)

cout << pchild->value() << endl;

pchild =     pchild->nextsibling();

關於結構體內存對齊的剖析

關於結構體內存對齊的問題,最直觀的體現便是在計算結構體大小的問題上。我們來看乙個例子 include includeint main s printf d n sizeof s system pause return 0 那麼在沒有考慮到結構體內存對齊之前,我們的常規思路應該是直接計算每個型別的大小...

xargs的原理剖析及用法詳解

1,使用find 的exec選項去處理匹配到的選項時,find 一次性將匹配到得引數傳給exec執行。但有的系統,對exec 傳的引數長度有限制,這樣在find 命令執行幾分鐘後會報溢位,錯誤資訊通常是 引數列太長 或 引數列溢位 2,xargs 與find 命令合用的時候,find 把匹配到得命令...

樹及樹的遍歷

幾個概念和性質 樹可以沒有結點,此情況下稱為空樹 empty tree 樹的層次 layer 從根結點開始算起,即根節點為第一層 把節點的子樹棵樹稱為結點的度 degree 而樹中結點的最大值的度稱為樹的度 樹的邊數等於結點數減1,反之,滿足連通且邊數等於結點數減1即為樹 結點深度自頂向下累加,結點...