ElementTree 删除元素
ElementTree Remove Element
Python 菜鸟在这里。想知道 删除 所有 updated
属性值为 true
的“profile
”标签的最干净、最好的方法是什么。
我已经尝试了以下代码,但它正在抛出:SyntaxError("cannot use absolute path on element")
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>
如果你使用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
Python 菜鸟在这里。想知道 删除 所有 updated
属性值为 true
的“profile
”标签的最干净、最好的方法是什么。
我已经尝试了以下代码,但它正在抛出:SyntaxError("cannot use absolute path on element")
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>
如果你使用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