Я пытаюсь получить весь элемент «имя пользователя» из config.xml, используя xml.etree.ElementTree. Но не могу получить данные, используя приведенный ниже код, он возвращает мне None.
import xml.etree.ElementTree as ET
tree = ET.parse('config.xml')
root = tree.getroot()
users = tree.findall('username')
print(users)
Если я использую приведенный выше код для повторной проверки какого-либо нормального XML-файла, он работает. Вот файл config.xml, который мне нужно использовать, возможно, в этом файле есть проблема с форматом, но я не могу понять.
<?xml version = "1.0" encoding = "UTF-8"?>
<rpc-reply
xmlns = "urn:ietf:params:xml:ns:netconf:base:1.0" message-id = "urn:uuid:cf3e02a2-b7bc-475f-a87e-b6571eca99b7"
xmlns:nc = "urn:ietf:params:xml:ns:netconf:base:1.0">
<data>
<app-hosting-cfg-data
xmlns = "http://cisco.com/ns/yang/Cisco-IOS-XE-app-hosting-cfg">
<apps>
<app>
<application-name>guestshell</application-name>
<application-network-resource>
<management-interface-name>0</management-interface-name>
</application-network-resource>
</app>
</apps>
</app-hosting-cfg-data>
<native
xmlns = "http://cisco.com/ns/yang/Cisco-IOS-XE-native">
<version>17.3</version>
<boot-start-marker/>
<boot-end-marker/>
<enable>
<secret>
<type>9</type>
<secret>$9$GNcSrWbM1PyCqU$9.BCza34ClqbgyABGzRV1v5hjCWhaoN9K.gqxCtcCvE</secret>
</secret>
</enable>
<username>
<name>developer</name>
<privilege>15</privilege>
<secret>
<encryption>9</encryption>
<secret>$9$oNguEA9um9vRx.$MsDk0DOy1rzBjKAcySWdNjoKcA7GetG9YNnKOs8S67A</secret>
</secret>
</username>
<username>
<name>netconf</name>
<privilege>15</privilege>
<secret>
<encryption>9</encryption>
<secret>$9$A7TadNm7VSWsXk$k0eVomchjOb90cjpI5hmLA/n0xlomzUhJ47o5y9WMHc</secret>
</secret>
</username>
<username>
<name>restconf</name>
<privilege>15</privilege>
<secret>
<encryption>9</encryption>
<secret>$14$eGCL$P15Lf8exJZB3qk$XYVi2eHOhT895Rpx1gYEQcwWfeML3AavoI/lxrMMtD.</secret>
</secret>
</username>
<username>
<name>root</name>
<privilege>15</privilege>
<secret>
<encryption>9</encryption>
<secret>$9$IRHgr7MCAEFNLk$ZfOrXoRLFhh6gHIxhLPfOC9KzjIWISv4KqkNAR51kmI</secret>
</secret>
</username>
</native>
</data>
</rpc-reply>
Возможный дубликат Вот этот.
Основываясь на нем, вы можете сделать:
namespaces = {
'Cisco-IOS-XE-native': "http://cisco.com/ns/yang/Cisco-IOS-XE-native"
}
for node in tree.findall(".//Cisco-IOS-XE-native:username", namespaces):
print(node)
Как раздражают пространства имен, верно?
Это простое выражение XPath выбирает все теги с именем username
в любом пространстве имен (или без него) из любой точки всего дерева.
users = tree.findall('.//{*}username')
Выход:
[<Element '{http://cisco.com/ns/yang/Cisco-IOS-XE-native}username' at 0x000002352F7529D0>, <Element '{http://cisco.com/ns/yang/Cisco-IOS-XE-native}username' at 0x000002352F751620>, <Element '{http://cisco.com/ns/yang/Cisco-IOS-XE-native}username' at 0x000002352F750CC0>, <Element '{http://cisco.com/ns/yang/Cisco-IOS-XE-native}username' at 0x000002352F751FD0>]
Стоит отметить, что tree.findall('username')
находит только теги с именем username
, которые являются дочерними элементами tree
. Он не ищет рекурсивно (т.е. по всему дереву). В этом случае у tree
есть только один ребенок, data
.
Что вам нужно (какие элементы) из элемента
username
? Как должен выглядеть ваш вывод? Пожалуйста, обновите сообщение с требуемым выводом