libxml2 - 删除子项,但不删除孙子项

时间:2010-08-29 07:28:30

标签: html c libxml2

我正在使用libxml2来解析HTML。我想删除某些格式标记,例如<center>,同时保留其内容(例如,链接)。

这意味着我必须从xmlNodeSet删除某些子节点,但要保留该节点的子节点。

现在,我收到了这段代码:

xmlNodePtr parentNode = nodes->nodeTab[i];

if (parentNode != NULL) {
    xmlNodePtr child = parentNode->children;
    xmlNodePtr parentNextSibling = parentNode->next;
    xmlNodePtr grandParent = NULL;

    while (child) {
        xmlUnlinkNode(child);
        if (parentNextSibling != NULL) {
            xmlAddPrevSibling(parentNextSibling, child);
        }
        else {
            if (grandParent == NULL)
                grandParent = parentNode->parent;
            xmlAddChild(grandParent, child);
        }

        child = child->next;
    }

    xmlUnlinkNode(parentNode);
    xmlFree(parentNode);
}

代码确实将子项添加到文档中,但它也删除了我将其作为兄弟添加到的节点。我做错了什么?

1 个答案:

答案 0 :(得分:1)

在将它从树中剪切掉之前,你没有保存孩子 - >下一个指针。一旦取消链接节点,它就不是树的一部分,所以child-&gt; next变为NULL。然后,在您将其重新插入树中之后(在parentNode-&gt; next之前),child-&gt; next指针现在指向之前的parentNode-&gt; next,所以下次循环时,删除parentNode-&gt ;下一个。事情只能从那里走下坡路。 : - )