2010-08-29 6 views
0

J'utilise libxml2 pour analyser HTML. Je souhaite supprimer certaines balises de mise en forme telles que <center>, tout en conservant leur contenu (par exemple, un lien).libxml2 - supprimer l'enfant, mais pas les petits-enfants

Cela signifie que je vais devoir supprimer certains nœuds enfants de mon xmlNodeSet, mais conserver les enfants de ce nœud.

En ce moment, je me suis ce code:

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); 
} 

Le code fait ajouter l'enfant au document, mais il supprime également le nœud que je l'ajouter en tant que frères et soeurs à. Qu'est-ce que je fais mal?

Répondre

1

Vous n'économisez pas l'enfant-> pointeur suivant avant de le couper de l'arbre. Dès que vous dissociez un noeud, il ne fait pas partie de l'arbre, alors child-> next devient NULL. Ensuite, après l'avoir réinséré dans l'arborescence (avant parentNode-> next), le pointeur next-> enfant pointe maintenant sur ce qui était précédemment parentNode-> next, donc la prochaine fois que vous parcourez la boucle, vous supprimez parentNode-> next. Les choses ne peuvent que dégringoler à partir de là. :-)