2011-03-31 143 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

每种方法都有其自身的优势/劣势,这取决于你想与你的应用程序做什么都。