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

时间:2018-10-15 16:23:30

标签: 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 val PowerShell打印时:

  

0x0328BFC0处的元素“值”

用于所有value标签。

1 个答案:

答案 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>