从etree中删除节点但留下子节点 [英] Remove a node from etree but leaving child
本文介绍了从etree中删除节点但留下子节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在遍历XML树,并且通过从树中提取一个节点离开它们的内部节点而遇到麻烦。
Im traversing a XML tree and im having some troubles by extracting a node from the tree leaving their inner nodes.
例如:
<xml>
<letter name="B">
<letter name="D">
<letter name="E">
<letter name="F">
<letter name="G">
</letter>
</letter>
</letter>
</letter>
</letter>
</xml>
我需要这样的东西:
<xml>
<letter name="B">
<letter name="D">
<letter name="F">
<letter name="G">
</letter>
</letter>
</letter>
</letter>
</xml>
但是我无法在不删除所有E个孩子的情况下得到它。
But i cant get this with out removing all E childs.
干杯!
推荐答案
想法是找到字母
元素为 name = E
,获取其父项,删除元素从父级开始,并使用元素的子级扩展父级:
The idea is to find the letter
element with name="E"
, get it's parent, remove the element from parent and extend the parent with element's children:
import xml.etree.ElementTree as etree
data = """
<xml>
<letter name="B">
<letter name="D">
<letter name="E">
<letter name="F">
<letter name="G">
</letter>
</letter>
</letter>
</letter>
</letter>
</xml>
"""
XPATH = './/letter[@name="E"]'
tree = etree.fromstring(data)
letter = tree.find(XPATH)
parent = tree.find(XPATH + '/..')
parent.remove(letter)
parent.extend(letter)
print etree.tostring(tree)
它打印:
<xml>
<letter name="B">
<letter name="D">
<letter name="F">
<letter name="G">
</letter>
</letter>
</letter>
</letter>
</xml>
UPD(使用迭代方法):
UPD (using iterative approach):
def iterparent(tree):
for parent in tree.getiterator():
for child in parent:
yield parent, child
tree = etree.fromstring(data)
for parent, child in iterparent(tree):
if child.tag == "letter" and child.attrib.get('name') == "E":
parent.remove(child)
parent.extend(child)
print etree.tostring(tree)
iterparent()
函数摘自 访问父母
文档中的段落。
iterparent()
function is taken from Accessing Parents
paragraph from docs.
这篇关于从etree中删除节点但留下子节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文