【问题标题】:Parsing XML file with lxml in Python在 Python 中使用 lxml 解析 XML 文件
【发布时间】:2014-08-22 16:40:44
【问题描述】:

我需要解析一个 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()')

【问题讨论】:

    标签: python xml xml-parsing lxml


    【解决方案1】:

    你需要在这里处理命名空间:

    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')
    

    【讨论】:

    • 可行,是否可以将提取的数据直接添加到命名元组而不是列表?就像这样 interafces = ('interfaces'['interface', 'state'])
    • @dragon 不错,你也可以试试lxml.objectify..
    • 最后一点,我们也可以用同样的方式解析字符串而不是文件吗?
    • @dragon 当然,使用fromstring 而不是parse
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多