繁体   English   中英

Python 2.7:使用lxml查找和更新xml

[英]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-wertMax-wert

要搜索当前上下文(当前Signal ),请使用Min-wert ./Min-wert ,./ Min-wert ./Min-wert.//Min-wert 由于Min-wertSignal的直接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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM