2015-10-23 1 views
1

Я работаю с созданной программой частью xml, которая имеет ужасную маркировку. Я смог разобрать то, что я ищу, но я не думаю, что это очень питонов. Цель программы состоит в том, чтобы суммировать записи totalLines, среди прочих. Я использую elementtree для извлечения значений. Ищите предложения по упрощению моего синтаксиса.Работа с объектами xml child, ElementTree в Python

XML:

<?xml version="1.0"?> 
<Status name="System Status"> 
<Bean name="SLMHandler" cn="com.open.eventCollector.OSLMHandler"> 
    <Status name="SLF File manager for SODLC2"> 
     <Prop name="totalLines">1105413065</Prop> 
    </Status> 
</Bean> 

<Bean name="ThreadPool" cn="com.open.util.OThreadPoolBean"> 
    <Prop name="minThreads">5</Prop> 
    <Prop name="maxThreads">25</Prop> 
    <Prop name="checkedOutThreads">3</Prop> 
    <Prop name="availableThreads">2</Prop> 
    <Prop name="maxIdleTime">300000</Prop> 
</Bean> 

<Bean name="EventCollector" cn="com.open.eventCollector.OEventCollector"> 
    <Prop name="numUnmatchedLines">785319</Prop> 

    <Status name="Adapters"> 

     <Status name="Logfile_EpilogWin_Generic"> 
      <Prop name="linesRead">0</Prop> 
     </Status> 
    </Status> 
</Bean> 

Python:

import xml.etree.cElementTree as ET 
tree = ET.parse('test.xml') 
root = tree.getroot() 

for bean in root.findall('Bean'): 
    for status in bean.findall('Status'): 
     if 'Adapters' in status.get('name'): 
      for status2 in status.findall('Status'): 
       for prop in status2.findall('Prop'): 
        if 'linesRead' in prop.get('name'): 
         print prop.text 

ответ

3

Не знаю, как вы хотите, чтобы ваш конечный результат для печати, но вы можете сделать это за один раз с одним XPath выражение:

for lines in root.findall('.//Bean/Status[@name="Adapters"]/Status/Prop[@name="linesRead"]'): 
    print(lines.text) 

Отпечатки 0 для ваших данных образца.

+0

это отлично работает, к сожалению, сервер, с которым я работаю, полностью изолирован от Интернета и имеет только python 2.7, который, по-видимому, не поддерживает xpaths. –

 Смежные вопросы

  • Нет связанных вопросов^_^