Чтение из сложного XML на основе значений атрибутов с помощью Python

Вопрос или проблема

Я пытаюсь разобрать 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

  1. Импорт библиотек и загрузка файла: Вам нужно правильно импортировать библиотеку xml.etree.ElementTree и загрузить ваш XML-файл.
  2. Получение корневого элемента: После загрузки файла, получаем корневой элемент, с которым будем работать.
  3. Извлечение данных: Используя методы поиска, вы сможете извлекать значения по атрибутам.

Пример кода

Вот пример кода, который выполняет указанные действия и правильно находит элемент <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"> не найден.')

Разбор кода

  1. Форматирование пути: Помните о том, что обратные слеши (\) в пути необходимо экранировать, чтобы избежать ошибок. Используйте r'', чтобы указать, что строка является "сырой" и не требует экранирования символов.

  2. XPath-запрос: Путь .//double[@name="a"] ищет любой элемент <double> с атрибутом name, равным a, в любом поддереве. Убедитесь, что вы используете правильный синтаксис.

  3. Проверка наличия элемента: Перед попыткой доступа к атрибутам элемента убедитесь, что он существует (не None). Это позволит избежать ошибок выполнения.

Заключение

Правильный подход к парсингу XML с использованием ElementTree в Python требует внимательности к структуре XML иизводствия путей поиска. Следуя предложенному алгоритму, вы сможете успешно извлекать необходимые данные из более сложных структур XML. Если у вас возникнут дополнительные вопросы или потребуется помощь с другой частью вашего проекта, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...