python - 如何在 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
标签。
解决方案
首先,我认为你的外循环 ( 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>
推荐阅读
- eclipse - eclipse中的程序执行太慢了,昨天同一程序的执行速度很快
- c# - 如何调用,API 中的 POST 方法,其中包含一个类 Content
- spring - How to config JPA in spring mvc?
- pentaho - 为什么我在 pentaho cde 中传递日期参数时看不到示例数据图表?
- reactjs - reactjs链接不起作用,在ajax请求后渲染时
- netsuite - 通过 Suitelet 使用 Netsuite 信用卡付款
- primefaces - 在 Primefaces 数据表单元格编辑器中选择每个项目上的选择行复选框
- python - 为衰减变量优化以下python代码部分
- git - 如何在 azure devops 中设置默认分支策略
- c - 试图从 C 代码中获取 windows 版本