繁体   English   中英

在Python中使用lxml解析XML文件

[英]Parsing XML file with lxml in Python

我需要解析一个XML文件,以免称为example.xml,它看起来像下面的样子:

<?xml version="1.0" encoding="ISO-8859-1"?>
<nf:rpc-reply xmlns:nf="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="http://www.cisco.com/nxos:1.0:if_manager">
 <nf:data>
  <show>
   <interface>
    <__XML__OPT_Cmd_show_interface___readonly__>
     <__readonly__>
      <TABLE_interface>
       <ROW_interface>
        <interface>Ethernet1/1</interface>
        <state>down</state>
        <state_rsn_desc>Link not connected</state_rsn_desc>
        <admin_state>up</admin_state>

我需要像这样获取“接口”和“状态”元素:['Ethernet1 / 1','down']这是我的解决方案,不起作用:

from lxml import etree

parser = etree.XMLParser()
tree = etree.parse('example.xml', parser)

print tree.xpath('//*/*/*/*/*/*/*/*/interface/text()')
print tree.xpath('//*/*/*/*/*/*/*/*/state/text()')

您需要在此处处理名称空间:

from lxml import etree

parser = etree.XMLParser()
tree = etree.parse('example.xml', parser)
ns = {'ns': 'http://www.cisco.com/nxos:1.0:if_manager'}

interface = tree.find('//ns:ROW_interface', namespaces=ns)
print [interface.find('.//ns:interface', namespaces=ns).text,
       interface.find('.//ns:state', namespaces=ns).text]

打印:

['Ethernet1/1', 'down']

使用collections.namedtuple()

interface_node = tree.find('//ns:ROW_interface', ns)

Interface = namedtuple('Interface', ['interface', 'state'])
interface = Interface(interface=interface_node.find('.//ns:interface', ns).text,
                      state=interface_node.find('.//ns:state', ns).text)

print interface

打印:

Interface(interface='Ethernet1/1', state='down')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM