下面是名為 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即為樹 結點深度自頂向下累加,結點...