【问题标题】:ElementTree find() always returns "None" Cisco iOS xeElementTree find() 总是返回“无” Cisco iOS xe
【发布时间】:2019-07-28 18:15:19
【问题描述】:

当使用 find 函数时,总是不返回任何内容

我尝试了不同类型的标签,但始终没有返回。

这是我得到的 XML 响应

<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:62b25025-051e-4cd7-ad9f-ab0d5e21b634">
   <data>
      <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
         <interface>
            <GigabitEthernet>
               <name>1</name>
               <ip>
                  <address>
                     <dhcp />
                  </address>
               </ip>
               <mop>
                  <enabled>false</enabled>
                  <sysid>false</sysid>
               </mop>
               <negotiation xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-ethernet">
                  <auto>true</auto>
               </negotiation>
            </GigabitEthernet>
         </interface>
      </native>
   </data>
</rpc-reply>

这是我使用的查找语句。

address = get_reply.data.find('{http://cisco.com/ns/yang/Cisco-IOS-XE-ethernet}interface')

我希望得到标签。

提前致谢:)

【问题讨论】:

  • 你想得到什么“标签”? interface 条目中还有一些其他信息。
  • 这是 Python 标准库 ElementTree 吗? (哪个版本?) lxml 实现?我想确定我正在测试您所询问的相同版本。使您的 minimal reproducible example 包含 import 行和实际的解析操作(可能将 XML 作为常量字符串移动到代码中,以使代码复制到粘贴到测试)可以帮助回答其中一些问题,顺便说一句。
  • @MigB id 喜欢获取 标签,查看ip信息。谢谢
  • @CharlesDuffy 我正在使用 lxml==4.2.5。

标签: python xml elementtree


【解决方案1】:

这里(代码没有使用任何外部库 - 只是核心 python)

import xml.etree.ElementTree as ET

xml = '''<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:62b25025-051e-4cd7-ad9f-ab0d5e21b634">
   <data>
      <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
         <interface>
            <GigabitEthernet>
               <name>1</name>
               <ip>
                  <address>
                     <dhcp />
                  </address>
               </ip>
               <mop>
                  <enabled>false</enabled>
                  <sysid>false</sysid>
               </mop>
               <negotiation xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-ethernet">
                  <auto>true</auto>
               </negotiation>
            </GigabitEthernet>
         </interface>
      </native>
   </data>
</rpc-reply>'''


root = ET.fromstring(xml)
interface = root.getchildren()[0].getchildren()[0].getchildren()[0]
print(interface)
gigabit_ethernet_name = interface.getchildren()[0].getchildren()[0].text
print('gigabit_ethernet_name: {}'.format(gigabit_ethernet_name))

输出

<Element '{http://cisco.com/ns/yang/Cisco-IOS-XE-native}interface' at 0x023E3A20>
gigabit_ethernet_name: 1

【讨论】:

  • 感谢@balderman 抽出时间回复,对不起,伙计们,但我是新手 :),当我尝试将回复打印为文本时,我只看到空白。 &gt;&gt;&gt; print(interface.text) &gt;&gt;&gt;
  • 界面没有文字。它下面的元素都有。
  • @Erick 代码已更新并显示 GigabitEthernet 名称的值
  • 看到了,非常感谢!如果我想获取 中的所有标签怎么办?例如:&lt;GigabitEthernet&gt; &lt;name&gt;1&lt;/name&gt; &lt;ip&gt; &lt;address&gt; &lt;dhcp /&gt; &lt;/address&gt; &lt;/ip&gt; &lt;mop&gt; &lt;enabled&gt;false&lt;/enabled&gt; &lt;sysid&gt;false&lt;/sysid&gt; &lt;/mop&gt; &lt;negotiation xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-ethernet"&gt; &lt;auto&gt;true&lt;/auto&gt; &lt;/negotiation&gt; &lt;/GigabitEthernet&gt;
【解决方案2】:

find 本身不会递归。使用ETXPath 可以让你获得递归(使用//并且指定命名空间内联:

>>> import lxml.etree
>>> root = lxml.etree.fromstring('''
... <?xml version="1.0" encoding="UTF-8"?>
... <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:62b25025-051e-4cd7-ad9f-ab0d5e21b634">
...    <data>
...       <native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
...          <interface>
...             <GigabitEthernet>
...                <name>1</name>
...                <ip>
...                   <address>
...                      <dhcp />
...                   </address>
...                </ip>
...                <mop>
...                   <enabled>false</enabled>
...                   <sysid>false</sysid>
...                </mop>
...                <negotiation xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-ethernet">
...                   <auto>true</auto>
...                </negotiation>
...             </GigabitEthernet>
...          </interface>
...       </native>
...    </data>
... </rpc-reply>
... '''.strip().encode('utf-8')
>>> lxml.etree.ETXPath('//{http://cisco.com/ns/yang/Cisco-IOS-XE-native}interface')(root)
[<Element {http://cisco.com/ns/yang/Cisco-IOS-XE-native}interface at 0x101cc8410>]

另外,请注意,您要检索的正确命名空间是以 interface 结尾的命名空间,而不是 native

【讨论】:

  • 好,我测试了一下,看到了,但是在我看的书中,作者使用find(),取回了指定标签内的所有内容,包括其他标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 2019-12-12
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多