gpt4 book ai didi

python - 解析 xml 查找具有匹配属性的最后一个元素

转载 作者:太空宇宙 更新时间:2023-11-04 00:55:23 25 4
gpt4 key购买 nike

我有一些写得不好的 xml,我试图循环并提取每个测试的测试名称、开始和结束时间。我使用该数据将一列附加到 csv。我当前的实现检查 xml 中的每个元素并且似乎很慢。

这是一个xml例子

<ProcessStart Id="1" Type="MemTest" Name="WriteRead" Options=" /pi=5 /m=AA" Tick="1233" />
<ProcessStart Id="2" Type="MemTest" Name="WriteRead" Options=" /pi=5 /m=AA" Tick="1233" />
<ProcessStart Id="3" Type="MemTest" Name="WriteRead" Options=" /pi=5 /m=AA" Tick="1233" />
<ProcessEnd Id="1" Tick="7553"/>
<ProcessEnd Id="2" Tick="7553"/>
<ProcessEnd Id="3" Tick="7553"/>
<ProcessStart Id="17" Type="MemTest" Name="WriteRead" Options=" /pi=25 /m=AA" Tick="8126" />
<ProcessStart Id="18" Type="MemTest" Name="WriteRead" Options=" /pi=25 /m=AA" Tick="8127" />
<ProcessStart Id="19" Type="MemTest" Name="WriteRead" Options=" /pi=25 /m=AA" Tick="8127" />
<ProcessEnd Id="17" Tick="12873"/>
<ProcessEnd Id="18" Tick="12873"/>
<ProcessEnd Id="19" Tick="12873"/>

试图弄清楚如何获取与名称和选项匹配的 processStart 的 Id 值。到目前为止,我有:

root.find('ProcessStart[@Name="%s"][last()]' % test_name).get('Id')

但不是检查与测试名称匹配的最后一个元素,而是检查 processStart 的最后一个元素。我该如何解决这个问题?或者提取此信息的最快方法是逐行读取输入文件吗?

新信息我想返回 Id=3 的 Id 值。这是最后一个值,其中存在具有匹配名称和选项的所有 ProcessStart。显示的当前计数立即引用 ProcessStart 的最后一个实例,然后检查名称和选项条件。我正在寻找一种方法来找到具有匹配条件的最后一个 ProcessStart。

也许更好的例子是通过选项匹配,因为这个实例的名称是相同的,所以:

options=" /pi=5 /m=AA"
test_id=root.find('ProcessStart[@Options="%s"][last()]' % options).get('Id')

使用此示例和此数据集,它将返回错误“NoneType”对象没有属性“get”,我相信这是因为最后一个元素与选项不匹配。但是,我正在尝试将最后一个 ProcessStart 与匹配选项作为目标。

完整代码:

import xml.etree.ElementTree as ET

#Read the xml file
tree = ET.parse('C:/Users/mkaminski/Desktop/sample.xml')
root = tree.getroot()

#get the first option
test_option=root.find('ProcessStart').get('Options')
test_id=root.find('ProcessStart[@Options="%s"][last()]' % test_option).get('Id')

完整的 XML 文件:

<AppLog App="RPx" Version="0.6.1" BaseVer="0.0.1" Time="20160208153547" Tick="0">
<RPxTest TestName="Tests/WriteRead" LongName="WriteRead_b=0_pi=5_m=AA_i=0" Instances="16" Memory="49534849024" Options=" /pi=5 /m=AA" IdRange="1-17" Tick="1233" />
<ProcessStart Id="1" Type="MemTest" Name="WriteRead" Options=" /pi=5 /m=AA" Tick="1233" />
<ProcessStart Id="2" Type="MemTest" Name="WriteRead" Options=" /pi=5 /m=AA" Tick="1233" />
<ProcessStart Id="3" Type="MemTest" Name="WriteRead" Options=" /pi=5 /m=AA" Tick="1233" />
<ProcessEnd Id="1" Tick="7553"/>
<ProcessEnd Id="2" Tick="7553"/>
<ProcessEnd Id="3" Tick="7553"/>
<RPxTest TestName="Tests/WriteRead" LongName="WriteRead_b=0_pi=25_m=AA_i=0" Instances="16" Memory="49534849024" Options=" /pi=25 /m=AA" IdRange="17-33" Tick="8126" />
<ProcessStart Id="17" Type="MemTest" Name="WriteRead" Options=" /pi=25 /m=AA" Tick="8126" />
<ProcessStart Id="18" Type="MemTest" Name="WriteRead" Options=" /pi=25 /m=AA" Tick="8127" />
<ProcessStart Id="19" Type="MemTest" Name="WriteRead" Options=" /pi=25 /m=AA" Tick="8127" />
<ProcessEnd Id="17" Tick="12873"/>
<ProcessEnd Id="18" Tick="12873"/>
<ProcessEnd Id="19" Tick="12873"/>
</AppLog>

错误:

File "C:/Anaconda3/Scripts/samle.py", line 9, in <module>
test_id=root.find('ProcessStart[@Options="%s"][last()]' % test_option).get('Id')

AttributeError: 'NoneType' object has no attribute 'get'

最佳答案

我认为您遇到了 ElementTree 的 xpath 支持(不完整)的限制。使用 lxml,您的命令可以完美运行。

要使用 ElementTree 执行此操作,检索所有匹配的元素并让 Python 选择最后一个。

改变

options=" /pi=5 /m=AA"
test_id=root.find('ProcessStart[@Options="%s"][last()]' % options).get('Id')

options=" /pi=5 /m=AA"
test_id=root.findall('ProcessStart[@Options="%s"]' % options)[-1].get('Id')

在此命令中,我们将所有匹配的 ProcessStart 元素(按顺序)作为列表获取,并只获取最后一个。然后我们就可以抓取id了。

关于python - 解析 xml 查找具有匹配属性的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35371607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com