【问题标题】:Parsing xml with namespaces使用命名空间解析 xml
【发布时间】:2021-05-03 23:24:51
【问题描述】:

我正在使用 xml.etree.ElementTree 解析 XML 文件,并且正在读取 xml,但是当它运行时,我无法获取信息,因为 rpc-reply 和接口行具有 message- idxmlns。 (这里我只粘贴了我的 xml 的一部分)。所以,如果我手动删除 message-id xxxxmlns xxx 我可以解析 xml,如果没有,我不能获取信息。为什么我应该添加到我的 python 代码中?并正确获取信息。这个想法不是手动删除我评论的行。

<?xml version="1.0"?>
<rpc-reply message-id="urn:uuid:1577eb48-18f7-4818-afde-468fe24382d7" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
 <data>
  <interfaces xmlns="http://openconfig.net/yang/interfaces">
   <interface>
    <name>Loopback102</name>
    <state>
     <name>Loopback102</name>

我的python代码是:


    for data in root.findall('data'):
       for interfaces in data.findall('interfaces'):
          for interfacen in interfaces.findall('interface'):
             for state in interfacen.findall('state'):
                   inter = state.find('name').text
                   portoperationalstate = state.find('oper-status').text
                   protocol = state.find('admin-status').text
                   info1 = state.find('description').text

【问题讨论】:

  • 我并不精通 Python XML 解析器。但是,作为标准 DOM 的一部分,有方法 getElementsByTagName 和 getElementsByTageNameNS。第一个采用元素的本地名称,例如'interfaces',第二个将命名空间 URI 作为参数之一。我相信 Python 也会有相同的,你可以探索一下。它本质上看起来像命名空间问题。
  • 感谢@mzjn 和 Ironluca。我可以解决这个问题。

标签: python-3.x xml netconf


【解决方案1】:

我是这样解决的:

for rpc_reply in root.findall('{urn:ietf:params:xml:ns:netconf:base:1.0}data'):
   for data in rpc_reply.findall('{http://openconfig.net/yang/interfaces}interfaces'):
      for interfaces in data.findall('{http://openconfig.net/yang/interfaces}interface'):
         for interfacen in interfaces.findall('{http://openconfig.net/yang/interfaces}state'):
            inter = interfacen.find('{http://openconfig.net/yang/interfaces}name').text   
            portoperationalstate = interfacen.find('{http://openconfig.net/yang/interfaces}oper-status').text
            protocol = interfacen.find('{http://openconfig.net/yang/interfaces}admin-status').text
            info1 = interfacen.find('{http://openconfig.net/yang/interfaces}description').text

我使用了来自https://docs.python.org/3/library/xml.etree.elementtree.html的命名空间相关信息

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 2010-11-08
    • 2018-07-15
    • 2012-06-11
    • 2015-09-08
    • 2011-09-20
    • 2012-10-14
    相关资源
    最近更新 更多