如何在Python中引用标记之间的XML值

如何在Python中引用标记之间的XML值,python,xml,Python,Xml,所以问题就在这里:val=str(vars.find('value')),因为当我运行此代码并print valPowerShell打印时: 0x0328BFC0处的元素“值” 对于所有值标记 首先,我认为您的外部循环(for child in root.iter())不是您想要的,因为它将遍历文档中的所有元素。这将导致您多次访问某些节点 其次,你看到 x = input("if find this value delete rule block ") str(x) for child in

所以问题就在这里:
val=str(vars.find('value'))
,因为当我运行此代码并
print val
PowerShell打印时:

0x0328BFC0处的元素“值”


对于所有
标记

首先,我认为您的外部循环(
for child in root.iter()
)不是您想要的,因为它将遍历文档中的所有元素。这将导致您多次访问某些节点

其次,你看到

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')
…因为您正在对
vars.find('value')
的结果调用
str
, 而
find
方法返回的是元素,而不是字符串。如果你想要 元素的文本内容,请使用
.text
属性。例如:

Element 'value' at 0x0328BFC0 
最后,您只能在的父级上使用
remove
方法 元素,因此调用
root.remove()
永远不会成功 去上班

综合以上所有因素,我们得到如下结果:

if value.text == x:
    ...
我不得不对你的输入文档做一些假设,所以我进行了测试 它与以下数据进行对比:

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')

*
地图
*
*
8795
4.
*

谢谢,一切正常,但您可以参考规则。我在同一个地方编写了这样的代码:rule.getparent().remove(rule)及其工作属性
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>