我有一些写得不好的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值。到目前为止,我已经:
^{pr2}$但不是检查与测试名称匹配的最后一个元素,而是检查processStart的最后一个元素。我如何解决这个问题?或者,提取这些信息的最快方法是逐行读取输入文件吗?在
新信息 我想返回Id值,其中Id=3。这是所有进程以匹配的名称和选项开始的最后一个值。显示的当前计数立即引用ProcessStart的最后一个实例,然后检查name和options条件。我正在寻找一种方法来找到与匹配条件匹配的最后一个进程。在
也许更好的例子是按选项匹配,因为此实例的名称相同,因此:
options=" /pi=5 /m=AA"
test_id=root.find('ProcessStart[@Options="%s"][last()]' % options).get('Id')
使用这个例子和这个数据集它将返回一个错误'NoneType'对象没有属性'get'我相信这是因为最后一个元素与选项不匹配。不过,我试图用匹配的选项来锁定最后一个进程start。在
完整代码:
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选择最后一个元素。在
改变
到
^{pr2}$在这个命令中,我们将所有匹配的ProcessStart元素(按顺序)作为一个列表,并只获取最后一个元素。然后我们就可以拿到身份证了
相关问题 更多 >
编程相关推荐