我正在使用Dom4j来分离节点,如下所示:
<div name="divName">
Some Text Here
<span>Some Text Here</span>
</div>
我按名称选择div节点,然后使用detach方法将其删除:
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()
这似乎删除div很好,我注意到它也删除了该div中的元素和文本。我正在寻找的是删除div而不删除div中的元素和文本,导致这个:
Some Text Here
<span>Some Text Here</span>
有可能用dom4j实现这个目标吗?如果没有关于如何解决这个问题的任何建议?
干杯
EEF
更新
@alamar
我已经获得了我想要的东西,通过你的代码和编辑它,这就是我想出的:
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()
这似乎有效,但在以下情况下将节点添加到父节点的末尾:
<div name="parent">
<div name="divName">
Some Text Here
<span>Some Text Here</span>
</div>
<div name="keep"></div>
</div>
结果如下:
<div name="parent">
<div name="keep"></div>
Some Text Here
<span>Some Text Here</span>
</div>
我试图找出如何让被删除节点的内容保持在其原始位置,在名为“keep”的div之前,而不是在名为“keep”的div之后添加。我尝试了一些但似乎无法实现这一点,任何人都可以帮忙吗?
EEF
答案 0 :(得分:1)
如果你想保持元素的顺序,你应该真正问parent
content()
。
在content
(由父元素支持的List)集合中,您应找到div
并将其替换为该div的content()
。
坦率地说,我不记得在python中这样做的惯用方法。
可能
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()
答案 1 :(得分:0)
尝试:
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)
我相信它会成功。
即。在分离每个div之后,你应该将每个div的孩子重新连接到div的父母身上。
答案 2 :(得分:0)
我遇到了类似的问题并使用以下功能解决了它(对我来说很好)
它在做什么:它将简单地删除该父标记,并将元素内的每个元素和节点包含在该位置的父元素中。
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);
}
}
}
享受cnsntrk