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

2024-10-01 19:22:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下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')

Tags: namesignalxmlminmaxsignalsascist
2条回答

一旦有了signal元素,就可以执行第二个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-wertSignal的直接子代,所以只要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以显示正确的更新)

<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>

相关问题 更多 >

    热门问题