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
使用查找函数时总是返回 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