libxml2 - удалить ребенка, но не внуков - PullRequest
0 голосов
/ 29 августа 2010

Я использую 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 Ответ

1 голос
/ 04 февраля 2011

Вы не сохраняете дочерний-> следующий указатель, прежде чем вырезать его из дерева.Как только вы отсоедините узел, он не станет частью дерева, поэтому child-> next станет NULL.Затем, после того, как вы снова вставите его в дерево (до parentNode-> next), указатель child-> next теперь указывает на то, что было ранее parentNode-> next, поэтому в следующий раз в цикле вы будете удалять parentNode-> next.Вещи могут идти вниз только оттуда.: -)

...