Вопрос или проблема
Я пытаюсь разобрать xml с помощью elemtree на python. Его структура подразумевает, что разница между узлами заключается не в тегах, а в описаниях, представленных в атрибутах. Мне действительно тяжело разобраться с xml. Чаще всего я получаю ‘None’.
Я попробовал множество примеров из учебников по elemtree, но они, похоже, предполагают более простые форматы xml. Я думал, что что-то вроде этого сработает, но он возвращает None.
xml.find('.//double [@name="a"]')
Где мой xml выглядит следующим образом (возможно, это не лучший формат xml, но с этим мне нужно работать)
<datatop number="10">
<variable0>100325</variable0>
<variable1>7654</variable1>
<data id="1" desc="Node1">
<double name="a" desc="attribute a">75</double>
<double name="b" desc="attribute b">45</double>
<double name="c" desc="attribute c">354</double>
</data>
<data id="2" desc="Node2">
<doubleArray name="d" desc="number array d">21645 22645 23645 24645</doubleArray>
<doubleArray name="e" desc="number array e">31645 32645 33645 34645</doubleArray>
</data>
</datatop>
ОбНОВЛЕНО:
Это я воссоздаю минимальный код, чтобы воспроизвести пример и решать возникающие проблемы. Я движусь в правильном направлении, но пробел сбивал меня с толку. Спасибо за советы.
import xml.etree.ElementTree as ET
XMLREAD = ET.parse('D:\example.xml')
XMLROOT = XMLREAD.getroot()
print(ET.tostring(XMLROOT))
print(XMLROOT.find('variable0').text)
print(ET.tostring(XMLREAD.find('.//double[@name="a"]')))
print(XMLREAD.find('.//double[@name="a"]').text)
Ответ или решение
Для успешного парсинга сложной структуры XML с использованием библиотеки ElementTree
в Python, важно учитывать множество факторов, включая корректное построение XPath-запросов и правильное обращение к элементам. Давайте более подробно рассмотрим, как можно эффективно извлечь данные из вашего примера XML, а также обсудим распространенные ошибки, которые могут привести к получению значения None
.
Анализ структуры XML
Приведенный вами XML-файл имеет следующую иерархическую структуру:
<datatop number="10">
<variable0>100325</variable0>
<variable1>7654</variable1>
<data id="1" desc="Node1">
<double name="a" desc="attribute a">75</double>
<double name="b" desc="attribute b">45</double>
<double name="c" desc="attribute c">354</double>
</data>
<data id="2" desc="Node2">
<doubleArray name="d" desc="number array d">21645 22645 23645 24645</doubleArray>
<doubleArray name="e" desc="number array e">31645 32645 33645 34645</doubleArray>
</data>
</datatop>
Основные шаги для парсинга XML
- Импорт библиотек и загрузка файла: Вам нужно правильно импортировать библиотеку
xml.etree.ElementTree
и загрузить ваш XML-файл. - Получение корневого элемента: После загрузки файла, получаем корневой элемент, с которым будем работать.
- Извлечение данных: Используя методы поиска, вы сможете извлекать значения по атрибутам.
Пример кода
Вот пример кода, который выполняет указанные действия и правильно находит элемент <double>
с атрибутом name="a"
:
import xml.etree.ElementTree as ET
# Загрузка XML-файла
XMLREAD = ET.parse(r'D:\example.xml') # Используйте r'' для избежания экранирования
XMLROOT = XMLREAD.getroot()
# Извлечение значений переменных
variable0 = XMLROOT.find('variable0').text # Получаем значение переменной
print(f'Значение переменной0: {variable0}')
# Поиск элемента <double> с атрибутом name="a"
double_a = XMLREAD.find('.//double[@name="a"]')
if double_a is not None:
print(f'Значение double с name="a": {double_a.text}')
else:
print('Элемент <double name="a"> не найден.')
Разбор кода
-
Форматирование пути: Помните о том, что обратные слеши (
\
) в пути необходимо экранировать, чтобы избежать ошибок. Используйтеr''
, чтобы указать, что строка является "сырой" и не требует экранирования символов. -
XPath-запрос: Путь
.//double[@name="a"]
ищет любой элемент<double>
с атрибутомname
, равнымa
, в любом поддереве. Убедитесь, что вы используете правильный синтаксис. -
Проверка наличия элемента: Перед попыткой доступа к атрибутам элемента убедитесь, что он существует (не
None
). Это позволит избежать ошибок выполнения.
Заключение
Правильный подход к парсингу XML с использованием ElementTree
в Python требует внимательности к структуре XML иизводствия путей поиска. Следуя предложенному алгоритму, вы сможете успешно извлекать необходимые данные из более сложных структур XML. Если у вас возникнут дополнительные вопросы или потребуется помощь с другой частью вашего проекта, не стесняйтесь задавать их!