我的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')
第一个问题是:
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
是Signal
的直接孩子,因此只需Min-wert
...
min_wert = signal[0].xpath('Min-wert')
max_wert = signal[0].xpath('Max-wert')
另一种选择是选择" aufloesung"," min-wert"one_answers" max-wert"。
完整示例...
XML输入(input.xml;添加了另一个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>
python
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>
拥有信号元素后,您可以执行第二个XPath以获取最小效果和最大效果元素:
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')