Pergunta

Eu estou usando dom4j destacar um nó, como abaixo:

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

Eu estou selecionando o nó div pelo nome e, em seguida, usando o método detach para removê-lo:

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()

Este parece remover a multa div, eu notei que ele também remove elementos e texto dentro desse div também. O que eu estou olhando para achive é remover a div sem remover os elementos e texto dentro do div, resultando no seguinte:

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

É possível obter este com dom4j? Se não quaisquer sugestões sobre como fazer isso?

Felicidades

Eef

Update:

@alamar

Eu achived o que eu queria, tendo o seu código e editando-o um pouco e é isso que eu vim com:

   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()

Isso parece funcionar, mas acrescenta os nós para o fim do nó pai na abaixo situação:

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

O resultado é o seguinte:

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

Eu estou tentando descobrir como obter o conteúdo do nó removido para ficar em sua posição original, antes Thed div chamado "keep", em vez de ser adicionado após a div com o nome de "guardar". Eu tentei algumas coisa, mas não consigo achive isso, alguém poderia ajudar?

Eef

Foi útil?

Solução

Se você quiser manter a ordem dos elementos, você deve realmente perguntar parent por sua content(). Nesse content (que é uma lista apoiada pelo elemento pai) coleção, você deve encontrar o seu div e substituí-lo com content() desse div.

Eu não me lembro de maneira idiomática de fazer isso em python, francamente.

Provavelmente

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()

Outras dicas

Tente:

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)

Eu acredito que faria o truque.

i. após remover todos os div, você deve recolocar criança de cada div em mãe da div.

Eu tive um problema semelhante e resolvido com a seguinte função (funciona bem para mim)

O que ele está fazendo:. Ele vai simplesmente remover essa tag pai e inclui todos os elementos e nó dentro do elemento para o pai nessa posição

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

desfrutar cnsntrk

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top