nó desanexar dom4j, Jython
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
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