Ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘text’, (xml, python)

#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/'

сделайте их одинаковыми, и все будет в порядке