#python #xml
#python #xml
Вопрос:
У меня есть XML-файл,
<?xml version="1.0" encoding="UTF-8"?>
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
<edit-config category = "xyz">
<target category="cooking">
<author>Giada De Laurentiis</author>
</target>
</edit-config>
</rpc>
Я хочу напечатать имя автора, я делаю это следующим образом,
from xml.etree.ElementTree import ElementTree
tree = ElementTree()
root = tree.parse("test.xml")
print ('Name: ', root.find('rpc/edit-conf/target/author').text)
Я получаю следующую ошибку, есть ли что-то, чего мне не хватает.
Ответ №1:
смотрите ниже
import xml.etree.ElementTree as ET
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
<edit-config category = "xyz">
<target category="cooking">
<author>Giada De Laurentiis</author>
</target>
</edit-config>
</rpc>'''
root = ET.fromstring(xml)
author = root.find('.//{urn:ietf:params:xml:ns:netconf:base:1.0}author')
print(author.text)
вывод
Giada De Laurentiis
Комментарии:
1. Это сработало, но в чем проблема с тем, как я пытаюсь напечатать имя автора, как будто я хочу знать, какую ошибку я совершаю?
2. Прочитайте о пространстве имен xml. Не забудьте проголосовать 🙂
Ответ №2:
Доступ к тегу будет доступен через следующий XPATH:
a = root.find('./{urn:ietf:params:xml:ns:netconf:base:1.0}edit-config/{urn:ietf:params:xml:ns:netconf:base:1.0}target/{urn:ietf:params:xml:ns:netconf:base:1.0}author')
# or ".//{urn:ietf:params:xml:ns:netconf:base:1.0}author" for skip middle sub elements and find subelements, on all levels.
Out[7]: <Element '{urn:ietf:params:xml:ns:netconf:base:1.0}author' at 0x7f01f9c1a220>
print(a.text)
xmlns
в теге rpc относится к пространству имен XML (используется для предотвращения конфликтов при попытке смешивания XML), а в файле XML элемент rool вы видите urn:ietf:params:xml:ns:netconf:base:1.0
как пространство имен.
Чтобы найти правильный Xpath шаг за шагом, попробуйте:
In [1]: root.find('./')
Out[1]: <Element '{urn:ietf:params:xml:ns:netconf:base:1.0}edit-config' at 0x7f01f9c16ef0>
In [2]: root.findall('./{urn:ietf:params:xml:ns:netconf:base:1.0}edit-config/')
Out[2]: [<Element '{urn:ietf:params:xml:ns:netconf:base:1.0}target' at 0x7f01fa2a4ea0>]
In [3]: root.findall('./{urn:ietf:params:xml:ns:netconf:base:1.0}edit-config/{urn:ietf:params:xml:ns:netconf:base:1.0}target/')
Out[3]: [<Element '{urn:ietf:params:xml:ns:netconf:base:1.0}author' at 0x7f01f9c1a220>]
In [4]: root.findall('./{urn:ietf:params:xml:ns:netconf:base:1.0}edit-config/{urn:ietf:params:xml:ns:netconf:base:1.0}target/{urn:ietf:params:xml:ns:netconf:base:1.0}author')
Out[4]: [<Element '{urn:ietf:params:xml:ns:netconf:base:1.0}author' at 0x7f01f9c1a220>]
Ответ №3:
xml-тег является <edit-config category = "xyz">
код ищет '/edit-conf/'
сделайте их одинаковыми, и все будет в порядке