我有一堆 xml 文件,我想从中删除一个名为 uid 且属性为 type = uri 的元素。还有元素 uid 的其他实例,但我只想删除具有 type=uri 属性的实例。每个 xml 文件中元素出现的次数和结构都是不同的。
我尝试了
root.findall("//uid[@type='uri']")
并尝试使用 remove()
方法来删除所有出现的元素。但这行不通。我无法使用固定的 XPATH,因为这不适用于所有 xml 文件。
例如:
<a>
<b>
<c>
<uid type ="x"> This needs to stay </uid>
</c>
<d>
<uid type ="uri"> This has to be removed </uid>
</d>
<e>
<uid type ="uri"> This has to be removed </uid>
<e>
</b>
</a>
我尝试过做
for uid in a.iter("//unitid[@type='uri']"):
a.remove(uid)
我还尝试使用
a.find()
和a.findall()
。该脚本不会抛出任何错误,但也不会执行所需的操作。
我对使用 ElementTree 进行 xml 解析相当陌生,所以我为我的天真道歉 .任何帮助表示赞赏。
一种可能的解决方案是找到所有父标签(其中有
<uid type="uri">
作为子标签),然后删除这些子标签:
import xml.etree.ElementTree as ET
xml_data = """
<a>
<b>
<c>
<uid type="x"> This needs to stay </uid>
</c>
<d>
<uid type="uri"> This has to be removed </uid>
</d>
<e>
<uid type="uri"> This has to be removed </uid>
</e>
</b>
</a>
"""
root = ET.fromstring(xml_data)
# this will find all tags that have <uid type="uri"> as child
parents = root.findall('.//uid[@type="uri"]...')
for p in parents:
p.remove(p.find('./uid[@type="uri"]'))
print(ET.tostring(root).decode())
打印:
<a>
<b>
<c>
<uid type="x"> This needs to stay </uid>
</c>
<d>
</d>
<e>
</e>
</b>
</a>