我使用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>我试图弄清楚如何使删除的节点的内容保持在原来的位置,而不是在名为“removed”的div之后添加,而不是在名为“added”的div之后添加。我试过几件事,但似乎做不到,有人能帮忙吗?
Eef
发布于 2009-05-14 13:43:08
如果您想要保持元素的顺序,就应该向parent请求它的content()。在这个content (它是一个由父元素支持的列表)集合中,您应该找到您的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()发布于 2009-05-14 11:14:17
尝试:
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的父母身上。
发布于 2013-05-27 05:59:57
我有一个类似的问题,并通过以下功能解决了这个问题(对我来说很好)
它在做什么:它将简单地删除父标记,并将元素中的每个元素和节点都包含到位于该位置的父元素中。
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);
}
}
}尽情享受
https://stackoverflow.com/questions/862709
复制相似问题