Как читать данные из XML-файла в Python, используя минидом - PullRequest
0 голосов
/ 23 января 2019

Каков наилучший (самый простой) способ чтения значения из XML-файла с использованием Python? Я новичок и пытался поиграть с минидомом, но не уверен, как отформатировать скрипт.

XML в /tmp/text.xml:

<computer>
<location>
<username>FirsLast</username>
</location>
</computer>

Я хочу проанализировать имя пользователя и использовать его в качестве переменной.

Вот что я пробовал:

#!/usr/bin/python

import xml.dom.minidom as minidom

doc = minidom.parse('/tmp/text.xml')
location = doc.getElementsByTagName('location')[0]
username = location.getAttribute('username')

print(username)

Я не получаю никаких результатов. Я бы ожидал увидеть FirsLast.

1 Ответ

0 голосов
/ 24 января 2019

С макушки моей головы:

import xml.dom.minidom as minidom
doc = minidom.parse('/tmp/tes.xml')
location = doc.getElementsByTagName('location')[0]
# If I recall carriage return and spaces are text nodes so we
# need to skip those
username = list(filter(lambda x: x.nodeType == minidom.Node.ELEMENT_NODE, location.childNodes))
print(username[0].firstChild.nodeValue)

Вы предполагаете, что username является атрибутом location, а это не так. Это дочерний узел, и он содержит другую дочернюю заметку, которая является текстом. Minidom довольно громоздок, поэтому, если вам действительно не придется работать с ним (из соображений безопасности), я советую вам использовать xml.etree.ElementTree

UPDATE

Оператор запросил пример с использованием ET:

import xml.etree.ElementTree as ET
sample = """
<computer>
<location>
<username>FirsLast</username>
</location>
</computer>
"""
doc = ET.fromstring(sample)
username = doc.findall('./location/username')
print(username[0].text)
...