首页 > 解决方案 > 如何在 Python 中引用标签之间的 XML 值

问题描述

<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 valPowerShell 打印:

0x0328BFC0 处的元素“值”

对于所有value标签。

标签: pythonxml

解决方案


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

其次,你看到...

Element 'value' at 0x0328BFC0 

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

推荐阅读