python - 在Python中使用lxml解析XML文件

标签 python xml xml-parsing lxml

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

我需要获取“接口(interface)”和“状态”元素,如下所示:['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()')

最佳答案

您需要在这里处理 namespace :

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

关于python - 在Python中使用lxml解析XML文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24521811/

相关文章:

c# - Linq to Xml : selecting elements if an attribute value equals a node value in an IEnumerable<XElement>

php - 使用 PHP MySQL 查询在 XML RSS 提要中编码错误 "entity not defined"

xml - 通过 bash 脚本重新格式化文件 linux 中的文本

c++ - 在 C++ 中解析无效的 XML

Python 函数返回语句期间出现内存错误

python - 存储 Python 程序设置的官方方式是什么?

java - XMLStreamWriter.writeStartElement(前缀,本地名称,命名空间URI): no binding of prefix to namespace

python - 在pyqtgraph中绘制一个矩形

python - 尝试使用MSBuild工具,Python,pip和Python依赖关系创建docker容器

java - 如何在没有java双引号的情况下发送Jaxb XmlAttribute数据