2013-09-05 2 views
1

У меня есть XML-файл, который имеет некоторые пределы тестирования, которые я хочу извлечь и записать в файл xls.извлечение данных из файла дерева xml с помощью python

<TestLimitSet> 
<AppName>Test Application</AppName> 
<Name>High-Speed test app</Name> 
<SummaryName>limit set 1.0</SummaryName> 
<SharedReference>DUT Specification Version 1.0</SharedReference> 
<TestLimits> 
    <!--########## Host Electrical Specification ##########--> 
    <!--Host Strobe Frequency--> 
    <TestLimit> 
     <ID>1101, 1102</ID> 
     <SummaryName>Host Strobe Frequency</SummaryName> 
     <SummaryDescription>The frequency must within the specification.</SummaryDescription> 
     <Reference>Section 3.</Reference> 
     <PrecisionLevel>0.01E+6</PrecisionLevel> 
     <PassLimits> 
      <Type>RANGE_INCLUSIVE</Type> 
      <Min>239.88E+6</Min> 
      <Max>240.12E+6</Max> 
     </PassLimits> 
    </TestLimit> 

    <!--Host Data Slew Rate--> 
    <TestLimit> 
     <ID>1201</ID> 
     <SummaryName>Host Data Slew Rate</SummaryName> 
     <SummaryDescription>Slew rate must within the specification.</SummaryDescription> 
     <Reference>Section 4.</Reference> 
     <PrecisionLevel>0.001</PrecisionLevel> 
     <PassLimits> 
      <Type>RANGE_INCLUSIVE</Type> 
      <Min>0.7</Min> 
      <Max>2.0</Max> 
     </PassLimits> 
    </TestLimit> 

    <!--Host Strobe Slew Rate--> 
    <TestLimit> 
     <ID>1202</ID> 
     <SummaryName>Host Strobe Slew Rate</SummaryName> 
     <SummaryDescription>Slew rate must within the specification.</SummaryDescription> 
     <Reference>Section 5.</Reference> 
     <PrecisionLevel>0.001</PrecisionLevel> 
     <PassLimits> 
      <Type>RANGE_INCLUSIVE</Type> 
      <Min>0.7</Min> 
     </PassLimits> 
    </TestLimit> 

</TestLimits> 

Я использую следующий код питона, чтобы извлечь данные:

from xml.etree import ElementTree 
document = ElementTree.parse('limitset.lim') 
# 
for testname in document.findall('TestLimits/TestLimit/SummaryName'): 
    print 'TestName:', testname.text 
    limits = document.find('TestLimits/TestLimit/PassLimits') 
    for node in limits.getchildren(): 
     print node.tag, node.text 

И это выход:

TestName: Host Strobe Frequency 
Type RANGE_INCLUSIVE 
Min 239.88E+6 
Max 240.12E+6 
TestName: Host Data Slew Rate 
Type RANGE_INCLUSIVE 
Min 239.88E+6 
Max 240.12E+6 
TestName: Host Strobe Slew Rate 
Type RANGE_INCLUSIVE 
Min 239.88E+6 
Max 240.12E+6 

Проблема заключается в том, что "Min" и «Max «всегда исходят из первого узла в XML вместо соответствующего раздела под именем теста. Может кто-то помочь решить проблему?

+0

См. Http://stackoverflow.com/help/someone-answers. – alecxe

ответ

0

Это потому, что вы используете document.find в цикле - он возвращает один и тот же узел каждый раз. Вы должны пойти следующим образом:

for limit in document.findall('TestLimits/TestLimit'): 
    testname = limit.find('.//SummaryName') 
    print 'TestName:', testname.text 
    limits = limit.find('.//PassLimits') 
    for node in limits.getchildren(): 
     print node.tag, node.text 
Смежные вопросы