2010-04-06 144 views
4

有沒有人有代碼遍歷TinyXML中的一個子樹的節點? IE:鑑於父母,遍歷所有的孩子和所有孩子的孩子?TinyXML遍歷子樹

回答

4

Begemoth的回答對我來說聽起來很不錯。

這裏是TiXmlElement的accept()方法,不使用訪問者的簡化版本,而是需要一個TiXmlNode *作爲參數:

void TiXmlIterator::iterate(const TiXmlNode* el) 
{ 
    cout << "Iterating Node " << el->Value() << endl; 
    // More useful code here... 

    for (const TiXmlNode* node=el->FirstChild(); node; node=node->NextSibling()) 
    { 
    iterate(node); 
    } 
// And/Or here. 
} 

的accept()方法需要一個TiXmlVisitor作爲參數,併爲你做所有的迭代,但。而且您不必在整個文檔中調用它,只需要遍歷子樹的根節點即可。這樣,您可以通過重寫正確的方法來爲TiXmlNode的子類定義特定的行爲。在TinyXml's source code中查看TiXmlPrinter的實現是一個很好的例子。

如果你不想這樣做,這裏是另一個例子:

bool MyTiXmlVisitor::Visit(const TiXmlText& text) 
{ 
    cout << "Visiting Text: " << text.Value() << endl; 

    return true; // This will ensure it keeps iterating 
} 

這將作用於你調用accept()上的節點的子樹的所有文本元素。要採取行動全部的元素,請覆蓋TiXmlVisitor的其餘虛擬方法。然後,要遍歷樹的代碼,請執行下列操作:

subtree_root_node->Accept(my_tixmlvisitor_object); 
+0

尋找實際的代碼。 – Raindog 2010-12-08 08:26:43

+0

TiXmlPrinter代碼應該是一個很好的開始。你有什麼特別想在每個節點上做的事情? – brak3000 2010-12-08 14:49:35

+0

好的,編輯我的答案以指定我和(我認爲)Begemoth的意思。 HTH。 – brak3000 2010-12-08 19:34:01

2

您可以在庫中使用訪問者模式實現。創建一個從TiXmlVistor繼承的類,重寫必要的方法(如VisitElement),然後調用特定節點的Accept()方法。

+0

不太什麼我問了 – Raindog 2010-10-14 02:59:15