Python 2.7:使用LXML查找和更新XML



我的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-wertMax-wert

搜索当前上下文(当前Signal(使用Min-wert./Min-wert.//Min-wert。由于Min-wertSignal的直接孩子,因此只需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')

最新更新