Question

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

<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 enlever l'amende div, je remarque qu'il supprime également les éléments et le texte dans ce div aussi. 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? Dans le cas contraire des suggestions sur la façon d'aller à ce sujet?

Vive

Eef

Mise à jour:

@alamar

J'achived ce que je voulais en prenant votre code et le modifier un peu et c'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>

Je suis en train de comprendre comment obtenir le contenu du nœud enlevé pour rester dans sa position initiale, avant thed div nommé « garder », au lieu d'être ajouté après la div avec le nom « garder ». Je l'ai essayé quelques chose mais ne peut pas sembler ACHIVE cela, quelqu'un pourrait-il aider?

Eef

Était-ce utile?

La solution

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

Je ne me souviens pas de façon idiomatiques 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()

Autres conseils

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 qu'il ferait l'affaire.

i.e.. après avoir détaché chaque div, vous devez refixer l'enfant de chaque div dans le parent div.

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

Qu'est-ce qu'il fait: il suffit d'enlever cette étiquette de parent et comprend tous les éléments et le noeud 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top