Первая проблема связана с этим:
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" и "Max-wert "с одним xpath.
Полный пример ...
XML Input (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>