<p>第一个问题是:</p>
<pre><code>signal = signals.xpath("//Signal/Name[@name='%s']" % signal_name)
</code></pre>
<p>您打算选择<code>Signal</code>,但实际上选择的是<code>Name</code></p>
<p>更改为:</p>
<pre><code>signal = signals.xpath("//Signal[Name/@name='%s']" % signal_name)
</code></pre>
<p>另外,在执行此操作时(特别是xpath中的<code>//</code>):</p>
<pre><code>min_wert = signal[0].xpath('//Min-wert')
max_wert = signal[0].xpath('//Max-wert')
</code></pre>
<p>XPath正在整个树中搜索第一个<code>Min-wert</code>和<code>Max-wert</code></p>
<p>要搜索当前上下文(当前<code>Signal</code>),请使用<code>Min-wert</code>、<code>./Min-wert</code>或<code>.//Min-wert</code>。因为<code>Min-wert</code>是<code>Signal</code>的直接子代,所以只要<code>Min-wert</code>就可以了</p>
<pre><code>min_wert = signal[0].xpath('Min-wert')
max_wert = signal[0].xpath('Max-wert')
</code></pre>
<p>另一种选择是用一个xpath选择“Aufloesung”、“Min-wert”和“Max-wert”</p>
<p>完整示例</p>
<p><strong>XML输入</strong>(Input.XML;添加了另一个<code>Signal</code>以显示正确的更新)</p>
<pre class="lang-xml prettyprint-override"><code><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>
</code></pre>
<p><strong>Python</strong></p>
<pre class="lang-py prettyprint-override"><code>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())
</code></pre>
<p><strong>XML输出</strong>(转储到控制台)</p>
<pre class="lang-xml prettyprint-override"><code><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>
</code></pre>