Python noob在这里。想知道使用profile
属性值updated
删除所有“true
”代码的最简洁,最好的方式是什么。
我尝试过以下代码,但它正在抛出: SyntaxError(“不能在元素上使用绝对路径”)
root.remove(root.findall("//Profile[@updated='true']"))
XML:
<parent>
<child type="First">
<profile updated="true">
<other> </other>
</profile>
</child>
<child type="Second">
<profile updated="true">
<other> </other>
</profile>
</child>
<child type="Third">
<profile>
<other> </other>
</profile>
</child>
</parent>
答案 0 :(得分:4)
如果您使用xml.etree.ElementTree
,则应使用remove()
方法删除节点,但这需要您拥有父节点引用。因此,解决方案:
import xml.etree.ElementTree as ET
data = """
<parent>
<child type="First">
<profile updated="true">
<other> </other>
</profile>
</child>
<child type="Second">
<profile updated="true">
<other> </other>
</profile>
</child>
<child type="Third">
<profile>
<other> </other>
</profile>
</child>
</parent>"""
root = ET.fromstring(data)
for child in root.findall("child"):
for profile in child.findall(".//profile[@updated='true']"):
child.remove(profile)
print(ET.tostring(root))
打印:
<parent>
<child type="First">
</child>
<child type="Second">
</child>
<child type="Third">
<profile>
<other> </other>
</profile>
</child>
</parent>
请注意,使用lxml.etree
这会更简单:
root = ET.fromstring(data)
for profile in root.xpath(".//child/profile[@updated='true']"):
profile.getparent().remove(profile)
其中ET
是:
import lxml.etree as ET