简体   繁体   English

ElementTree find()始终返回“无” Cisco iOS XE

[英]ElementTree find() always returns “None” Cisco iOS xe

When using find function always none is returned 使用查找功能时,始终不返回任何内容

I've tried differents types of tags and none is always returned. 我尝试了不同类型的标签,但始终不会返回。

This is the XML response i'm getting 这是我得到的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>

This is the find statement im using. 这是即时通讯使用的查找语句。

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

I expect to get the tag. 我希望得到标签。

Thanks in advance :) 提前致谢 :)

find , on its own, doesn't recurse. find本身不会递归。 Using ETXPath lets you get recursion (using // ) and specify the namespace inline: 使用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>]

Also, note that the correct namespace for what you wanted to retrieve was the one ending in interface , not native . 另外,请注意,要检索的正确名称空间是以interface结尾的名称空间,而不是native

Here (The code is not using any external library - just core python) 此处(代码未使用任何外部库-只是核心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))

output 输出

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM