2017-10-13 173 views
0

我坚持使用XML中的其他标记。我有以下XML使用XML解析Python XML

<result> 
<job> 
    <tenq>15:37:53</tenq> 
    <tdeq>15:37:53</tdeq> 
    <tlast>15:37:53</tlast> 
    <status>FIN</status> 
    <id>168</id> 
    </job> 
    <log> 
    <logs count="20" progress="100"> 
     <entry logid="6476178463223293277"> 
     <domain>1</domain> 
     <receive_time>2017/10/13 15:37:50</receive_time> 
     <serial>001801035328</serial> 
     <seqno>6291444553</seqno> 
     <----SKIP----> 
     <pkts_received>0</pkts_received> 
     <session_end_reason>policy-deny</session_end_reason> 
     <action_source>from-policy</action_source> 
     </entry> 
     <----SKIP----> 
    </logs> 
    </log> 
    <meta> 
    <devices> 
     <entry name="localhost.localdomain"> 
     <hostname>localhost.localdomain</hostname> 
     <vsys> 
      <entry name="vsys1"> 
      <display-name>vsys1</display-name> 
      </entry> 
     </vsys> 
     </entry> 
    </devices> 
    </meta> 
</result> 

要获得有关状态的信息我下面

xml_parsed = ET.fromstring(resp.text) 
    response_parsed = xml_parsed[0] 
    resp_elems = response_parsed.findall('job') 

然后,我应该得到的日志记录数量和读取所有日志条目。 为了获取日志,我再次开始:

response_parsed = xml_parsed[0] 
    resp_elems = response_parsed.findall('log') 
    job_status = resp_elems[0].find('entry') 

如何获得日志算? 存在更优雅的方式来解析信息?

回答

1

您可以使用xml.etree.ElementTree.Element.items()将元素属性作为(名称,值)对的序列来获取。请记住,属性是以任意顺序返回的,因此您可能需要进行一些平等或成员资格检查才能提取所需信息:

import xml.etree.ElementTree as ET 

xml_str = """<result> ... </result>""" 

tree = ET.fromstring(xml_str) 

for x in tree.find('log'): 
    print(x.items()) # [('count', '20'), ('progress', '100')] 
    print(''.join(y[1] for y in x.items() if 'count' in y[0])) # 20