【发布时间】:2021-01-11 22:57:12
【问题描述】:
我想删除一个包含所有属于他的子元素的特定元素。 要找到我要删除的元素,我想使用标签的 id 或标签的名称。
例如,给定这个 etree 对象
<?xml version="1.0" ?>
<root>
<tag_folders>
<folder id="1">Stars</folder>
<folder id="2">Planet</folder>
<folder id="3">Satellite</folder>
</tag_folders>
<tags>
<tag>
<name>Earth</name>
</tag>
<tag id="2">
<name>Sun</name>
</tag>
<tag id="29">
<name>Moon</name>
</tag>
</tags>
</root>
例如,我想删除 id 为“29”的 Moon
我想要的输出:
<?xml version="1.0" ?>
<root>
<tag_folders>
<folder id="1">Stars</folder>
<folder id="2">Planet</folder>
<folder id="3">Satellite</folder>
</tag_folders>
<tags>
<tag>
<name>Earth</name>
</tag>
<tag id="2">
<name>Sun</name>
</tag>
</tags>
</root>
这是我的代码:
def remove_tag(root, tag_id_r):
i = 0
for tag in root.iter('tag'):
tag_id = tag.get('id')
if (tag_id == tag_id_r):
#root.clear(tag)
#root.remove(tag)
#root[1][i].remove(tag)
# print(i, tag_id, tag_id_r, root[1][i])
i += 1
def main():
with open("lib.xml", 'a') as f:
tree = etree.parse('lib.xml')
root = tree.getroot()
remove_tag(root, input("What is the id of the tag you want to remove?"))
f.seek(0)
f.truncate()
dom = minidom.parseString(etree.tostring(tree, encoding="utf-8"))
print('\n'.join([line for line in dom.toprettyxml(indent=' '*2).split('\n') if line.strip()]), file=f)
main()
我在 cmets 中尝试了所有方法,但都不起作用
【问题讨论】:
-
如果您可以使用
lxml包,XSLT 将使这非常简单,无需单个循环。
标签: python xml elementtree