2009-05-14 11 views
1

J'utilise DOM4J pour détacher un nœud, comme ci-dessous:DOM4J noeud Détacher, Jython

<div name="divName"> 
    Some Text Here 
    <span>Some Text Here</span> 
</div> 

Je sélectionnant le nœud div par nom, puis en utilisant la méthode Détacher pour le supprimer:

xpathValue = "//*[contains(@name, 'divName')]" 
xpath = dom.createXPath(xpathValue) 
    if xpath != None: 
     nodes = xpath.selectNodes(dom) 
     if len(nodes) > 0: 
      for node in nodes: 
       node.detach() 

Cela semble supprimer la div fine, j'ai remarqué qu'il supprime également les éléments et le texte dans ce div également. Ce que je cherche à achive est de retirer la div sans enlever les éléments et le texte à l'intérieur du div, ce qui suit:

Some Text Here 
<span>Some Text Here</span> 

Est-il possible de cela avec dom4j achive? Si pas de suggestions sur la façon de s'y prendre?

Vive

Eef

Mise à jour:

@alamar

J'achived ce que je voulais en prenant votre code et de modifier un peu ce qui est ce que je suis venu avec:

xpathValue = "//*[contains(@name, 'divName')]" 
    xpath = dom.createXPath(xpathValue) 
    if xpath != None: 
     nodes = xpath.selectNodes(dom) 
     if len(nodes) > 0: 
      for node in nodes: 
       parent = node.getParent() 
       nodeContents = node.content() 
        if len(nodeContents) > 0: 
         for subNode in nodeContents: 
          parent.add(subNode.clone().detach()) 
      node.detach() 

Cela semble fonctionner, mais ajoute les noeuds à la fin du nœud parent dans la situation ci-dessous:

<div name="parent"> 
    <div name="divName"> 
     Some Text Here 
     <span>Some Text Here</span> 
    </div> 
    <div name="keep"></div> 
</div> 

Le résultat est le suivant:

<div name="parent"> 
    <div name="keep"></div> 
    Some Text Here 
    <span>Some Text Here</span> 
</div> 

J'essaie de comprendre comment obtenir le contenu du nœud supprimé doit rester dans sa position d'origine, avant le div appelé "keep", au lieu d'être ajouté après le div avec le nom "keep". J'ai essayé quelques trucs mais je ne peux pas sembler achive ceci, quelqu'un pourrait-il m'aider?

Eef

Répondre

1

Si vous voulez garder l'ordre des éléments, vous devriez vraiment demander parent pour son content(). Dans cette collection content (qui est une liste soutenue par l'élément parent), vous devez trouver votre div et le remplacer par content() div.

Je ne me souviens pas de façon idiomatique de le faire en python, franchement.

probablement

if xpath != None: 
    nodes = xpath.selectNodes(dom) 
    if len(nodes) > 0: 
     for node in nodes: 
      parent = node.getParent() 
      index = parent.indexOf(node) 
      siblings = parent.content() 
      nodeContents = node.content() 
       if len(nodeContents) > 0: 
        for subNode in nodeContents: 
         siblings.add(subNode.clone().detach(), index++) 
     node.detach() 
0

Essayez:

if xpath != None: 
    nodes = xpath.selectNodes(dom) 
    if len(nodes) > 0: 
     for div in nodes: 
      parent = div.getParent() 
      div.detach() 
      for(child in node.content()) 
       child.detach() 
       parent.add(child) 

je crois que ce serait faire l'affaire.

à savoir Après avoir détaché chaque div, vous devez rattacher l'enfant de chaque div dans le parent de div.

0

i eu un problème similaire et résolu avec la fonction suivante (fonctionne très bien pour moi)

Que fait-il: il suffit d'enlever cette étiquette de parent et comprend tous les éléments et noeud à l'intérieur de l'élément au parent à cette position.

private void _replaceTagByContent(Element element) { 
     Element parent = element.getParent(); 
     List elements = parent.elements(); 
     int insertPosition = elements.indexOf(element); 

     // add them all to the parent again 
     for (int i = 0, size = elements.size(); i < size; i++) { 
      Node node = (Node) elements.get(i); 
      if (i == insertPosition) { 

       // if we are here, then this has to be an element, since 
       // wo do only replace elements ... 

       for (int j = element.nodeCount() - 1; j >= 0; j--) { 
        Node theNode = element.node(j); 
        theNode.detach(); 
        elements.add(i, theNode); 
       } 

       // finally remove this node 
       elements.remove(node); 
      } 
     } 
    } 

profiter cnsntrk