ElementTree find() 总是 returns "None" Cisco iOS xe

ElementTree find() always returns "None" Cisco iOS xe

使用查找函数时总是返回 none

我尝试了不同类型的标签,但总是返回 none。

这是我收到的 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')

我希望拿到标签。

提前致谢:)

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

此处(代码未使用任何外部库 - 仅核心 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