<rule>
<vars>
<value>*</value>
<value>MAP</value>
<value></value>
<value>*</value>
<value>*</value>
<value>8795</value>
<value>4</value>
<value>*</value>
</vars>
</rule>
这是我的XML文件的一部分。我必须参考值标签之间的数字。我想在规则标记之间查找和删除代码。我尝试这样做:
x = input("if find this value delete rule block ")
str(x)
for child in root.iter():
for rule in child.findall('rule'):
for vars in rule.findall('vars'):
val = str(vars.find('value'))
print(val)
if val == x:
root.remove(rule)
tree.write('output.xml')
问题出在这里:val = str(vars.find('value'))
,因为当我运行此代码并且print val
PowerShell打印时:
0x0328BFC0处的元素“值”
用于所有value
标签。
答案 0 :(得分:1)
首先,我认为您不需要的是外部循环(for child in root.iter()
),因为这将迭代文档中的所有元素。这将导致您多次访问某些节点。
第二,您看到了...
Element 'value' at 0x0328BFC0
...因为您是根据str
的结果调用vars.find('value')
,
find
方法将返回 elements ,而不是字符串。如果你想要
元素的文本内容,请使用.text
属性。例如:
if value.text == x:
...
最后,您只能在父级的父级上使用remove
方法
您要删除的元素,因此永远不会调用root.remove()
上班。
将以上所有内容放在一起,我们会得到类似的东西:
from lxml import etree
doc = etree.parse('data.xml')
root = doc.getroot()
target = input('remove items with this value: ')
for rule in root.findall('rule'):
for vars in rule.findall('vars'):
for value in vars.findall('value'):
if value.text == target:
value.getparent().remove(value)
doc.write('output.xml')
我不得不对您的输入文档做一些假设,因此我进行了测试 针对以下数据:
<?xml version="1.0"?>
<document>
<rule>
<vars>
<value>*</value>
<value>MAP</value>
<value></value>
<value>*</value>
<value>*</value>
<value>8795</value>
<value>4</value>
<value>*</value>
</vars>
</rule>
</document>