2011-03-31 148 views
1

我是libxml的新手。我想寫一個循環來遍歷一個子節點的所有子節點,例如libxml - 遍歷孩子的所有孩子

<par>i want to <bold>loop <italic>through </italic> all</bold> children in this node</pa R>

此刻我的循環代碼看起來像下面,但我只得到了「大膽」節點而不是「斜體」的孩子。

if (xmlStrEqual(node->name, BAD_CAST "p")) { 

    xmlNodePtr child = node->children; 

     while (child != NULL) { 

      child = child->next; 
     } 
    } 

可以想象的是,節點結構可能增長至4-5元,所以我需要一個解決方案,它是更強大的是把while循環while循環中。任何幫助,將不勝感激請。

回答

1

您使用的xmlTree界面是平行的。 < par>有3個孩子 - 之前的文字<黑體>,<黑體>本身,之後的文字。 < bold>有自己的孩子,其中包括<斜體>。節點 - >子列表僅包含節點的子節點立即

有幾種方法可以獲得所需的行爲。

  • 在處理孩子,你可以遞歸處理兒童安全>孩子去<大膽>的孩子,其中包括<斜體>

  • 如果你正在尋找專爲< itallic> (或者對於一組特定節點),可以使用XPath表達式(例如「par italic」)來查找par下的任何斜體節點。 http://www.xmlsoft.org/examples/index.html#XPath

  • 你可以看看libxml2的xmlTextReader接口而不是這個xmlTree。它提供了您期望的文檔的序列「通讀」。 http://xmlsoft.org/xmlreader.html

每種方法都有其自身的優勢/劣勢,這取決於你想與你的應用程序做什麼都。