[英]Python 2.7 : Find and update xml using lxml
我有下面的xml:
<?xml version='1.0' encoding='UTF-8'?>
<parserResult>
<ParsedData>
<Signals>
<Signal>
<Name name="asc_epsWarn_mu8"/>
<Aufloesung ist="" soll="2^-0"/>
<Min-wert ist="" soll="0"/>
<Max-wert ist="" soll="1"/>
<ErrorClass error="Signal does not exist in A2L file"/>
<Bewertung evaluation="FAIL"/>
</Signal>
</Signals>
</ParsedData>
</parserResult>
我想搜索信号名称并更新Aufloseung,Min-wert和Max-wert元素。 我从外部源获取<Signals>
元素,然后可以在xml中找到信号。
signal_name = asc_epsWarn_mu8
signal = signals.xpath("//Signal/Name[@name='%s']" % signal_name)
现在如何更新此信号的Aufloseung,Min-wert和Max-wert元素? 我想要类似以下的输出:
<?xml version='1.0' encoding='UTF-8'?>
<parserResult>
<ParsedData>
<Signals>
<Signal>
<Name name="asc_epsWarn_mu8"/>
<Aufloesung ist="23" soll="2^-0"/>
<Min-wert ist="23" soll="0"/>
<Max-wert ist="23" soll="1"/>
<ErrorClass error="Signal does not exist in A2L file"/>
<Bewertung evaluation="FAIL"/>
</Signal>
</Signals>
</ParsedData>
</parserResult>
更新:我尝试下面的代码,但它不会更新我的值:
min_wert = signal[0].xpath('//Min-wert')
max_wert = signal[0].xpath('//Max-wert')
min_wert[0].set('ist','23')
max_wert[0].set('ist','23')
获得信号元素后,您可以执行第二个xpath来获取Min-wert和Max-wert元素:
min_wert = signal[0].xpath('//Min-wert')[0]
max_wert = signal[0].xpath('//Max-wert')[0]
然后,您可以设置属性:
min_wert.set('ist','23')
max_wert.set('ist','23')
第一个问题是这样的:
signal = signals.xpath("//Signal/Name[@name='%s']" % signal_name)
您打算选择Signal
,但实际上是在选择Name
。
更改为:
signal = signals.xpath("//Signal[Name/@name='%s']" % signal_name)
此外,当你做到这一点(特别是//
中的XPath):
min_wert = signal[0].xpath('//Min-wert')
max_wert = signal[0].xpath('//Max-wert')
XPath正在整个树中搜索第一个Min-wert
和Max-wert
。
要搜索当前上下文(当前Signal
),请使用Min-wert
./Min-wert
,./ Min-wert
./Min-wert
或.//Min-wert
。 由于Min-wert
是Signal
的直接Min-wert
,因此Min-wert
就是您所需要的...
min_wert = signal[0].xpath('Min-wert')
max_wert = signal[0].xpath('Max-wert')
另一种选择是使用单个xpath选择“ Aufloesung”,“ Min-wert”和“ Max-wert”。
完整的例子...
XML输入 (input.xml;添加了另一个Signal
以显示正确的Signal
已更新)
<parserResult>
<ParsedData>
<Signals>
<Signal>
<Name name="ignore me"/>
<Aufloesung ist="" soll="2^-0"/>
<Min-wert ist="" soll="0"/>
<Max-wert ist="" soll="1"/>
</Signal>
<Signal>
<Name name="asc_epsWarn_mu8"/>
<Aufloesung ist="" soll="2^-0"/>
<Min-wert ist="" soll="0"/>
<Max-wert ist="" soll="1"/>
<ErrorClass error="Signal does not exist in A2L file"/>
<Bewertung evaluation="FAIL"/>
</Signal>
</Signals>
</ParsedData>
</parserResult>
蟒蛇
from lxml import etree
tree = etree.parse("input.xml")
signal_name = "asc_epsWarn_mu8"
signal = tree.xpath("//Signal[Name/@name='%s']" % signal_name)[0]
for elem in signal.xpath("*[self::Aufloesung or self::Min-wert or self::Max-wert]"):
elem.set("ist", "23")
etree.dump(tree.getroot())
XML输出 (转储到控制台)
<parserResult>
<ParsedData>
<Signals>
<Signal>
<Name name="ignore me"/>
<Aufloesung ist="" soll="2^-0"/>
<Min-wert ist="" soll="0"/>
<Max-wert ist="" soll="1"/>
</Signal>
<Signal>
<Name name="asc_epsWarn_mu8"/>
<Aufloesung ist="23" soll="2^-0"/>
<Min-wert ist="23" soll="0"/>
<Max-wert ist="23" soll="1"/>
<ErrorClass error="Signal does not exist in A2L file"/>
<Bewertung evaluation="FAIL"/>
</Signal>
</Signals>
</ParsedData>
</parserResult>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.