Python для чтения xml-файла

Обновлено: 24.11.2024

В этой статье мы изучим различные способы чтения XML-файлов в Python. Мы будем использовать некоторые встроенные модули и библиотеки, доступные в Python, а также некоторые связанные с ними пользовательские примеры. Давайте сначала кратко рассмотрим полную форму XML, введение в XML, а затем прочитаем о различных модулях синтаксического анализа для чтения XML-документов в Python.

Введение в XML

XML означает расширяемый язык разметки. Это необходимо для отслеживания небольшого и среднего объема знаний. Это позволяет программистам разрабатывать свои собственные приложения для чтения данных из других приложений. Метод чтения информации из XML-файла и дальнейшего анализа его логической структуры известен как синтаксический анализ. Таким образом, чтение XML-файла ничем не отличается от анализа XML-документа.

<р>1. MiniDOM (минимальная объектная модель документа)

<р>2. BeautifulSoup вместе с парсером lxml

<р>4. Простой API для XML (SAX)

XML-файл: мы используем этот XML-файл для чтения в наших примерах.

Чтение XML-файла с помощью MiniDOM

Это модуль Python, используемый для чтения файла XML. Он предоставляет функцию parse() для чтения файла XML. Мы должны сначала импортировать Minidom, прежде чем использовать его функцию в приложении. Синтаксис этой функции приведен ниже.

Синтаксис

Эта функция возвращает документ типа XML.

Пример чтения XML-файла в Python

Поскольку каждый узел будет рассматриваться как объект, мы можем получить доступ к атрибутам и тексту элемента, используя свойства объекта. Посмотрите на пример ниже, мы получили доступ к атрибутам и тексту выбранного узла.

Чтение XML-файла с помощью BeautifulSoup вместе с парсером lxml

В этом примере мы будем использовать библиотеку Python с именем BeautifulSoup. Beautiful Soup поддерживает парсер HTML (lxml), включенный в стандартную библиотеку Python. Используйте следующую команду, чтобы установить красивый суп и парсер lmxl, если он не установлен.

После успешной установки используйте эти библиотеки в коде Python.

Мы используем этот файл XML для чтения кода Python.

Пример чтения XML-файла в Python

Давайте прочитаем приведенный выше файл, используя библиотеку BeautifulSoup в скрипте Python.


[ Добавить номер модели здесь , Добавить цену здесь ]
Acer - ноутбук
12

Чтение файла XML с помощью дерева элементов

Модуль дерева элементов предоставляет нам несколько инструментов для работы с XML-файлами. Установка не требуется. Благодаря формату XML, присутствующему в иерархическом формате данных, его становится проще представить в виде дерева. Дерево элементов представляет весь XML-документ как единое дерево.

Пример чтения XML-файла в Python

Чтобы прочитать файл XML, во-первых, мы импортируем класс ElementTree, найденный в библиотеке XML. Затем мы передадим имя файла XML в метод ElementTree.parse(), чтобы начать синтаксический анализ. Затем мы получим родительский тег XML-файла, используя getroot(). Затем мы отобразим родительский тег файла XML. Теперь для получения атрибутов вложенного тега родительского тега будет использоваться root[0].attrib . Наконец, отобразите текст, заключенный в 1-м вложенном теге 5-го вложенного тега корня тега.

Чтение файла XML с помощью простого API для XML (SAX)

В этом методе сначала регистрируются обратные вызовы для происходящих событий, а затем синтаксический анализатор обрабатывает документ. это может быть полезно, когда документы большие или присутствуют ограничения памяти. Он анализирует файл, потому что читает его с диска, а также не сохраняет весь файл в памяти. Чтение XML с помощью этого метода требует создания ContentHandler путем подкласса xml.sax.ContentHandler.

Примечание. Этот метод может быть несовместим с версией Python 3. Перед применением этого метода проверьте свою версию.

  • ContentHandler — обрабатывает теги и атрибуты XML. ContentHandler вызывается в начале и в конце каждого элемента.
  • startDocument и endDocument — вызываются в начале и в конце XML-файла.
  • Если синтаксический анализатор не находится в режиме пространства имен, вызываются методы startElement(тег, атрибуты) и endElement(тег); в противном случае — соответствующие методы startElementNS и endElementNS

XML-файл

Пример кода Python


*****Модель*****
Номер модели: ST001
Цена: 35000
Количество: 12
Компания: Samsung
>*****Модель*****
Номер модели: RW345
Цена: 46500
Количество: 14
Компания: Onida
***** Модель*****
Номер модели: EX366
Цена: 30000
Количество: 8
Компания: Lenovo
******Модель*****
Номер модели: FU699
Цена: 45000
Количество: 12
Компания: Acer

Заключение

В этой статье мы узнали о XML-файлах и различных способах чтения XML-файла с помощью нескольких встроенных модулей и API, таких как Minidom , Beautiful Soup , ElementTree , Simple API(SAX) . Мы также использовали некоторые пользовательские коды синтаксического анализа для анализа XML-файла.

Расширяемый язык разметки, широко известный как XML, представляет собой язык, разработанный специально для того, чтобы его было легко интерпретировать как людьми, так и компьютерами. Язык определяет набор правил, используемых для кодирования документа в определенном формате. В этой статье описаны методы чтения и записи XML-файлов в Python.

Примечание. Обычно процесс чтения данных из XML-файла и анализа его логических компонентов называется синтаксическим анализом. Поэтому, когда мы говорим о чтении XML-файла, мы имеем в виду анализ XML-документа.

  • BeautifulSoup используется вместе с парсером xml lxml
  • Библиотека Elementtree.

Использование BeautifulSoup вместе с парсером lxml

Для чтения и записи XML-файла мы будем использовать библиотеку Python с именем BeautifulSoup. Чтобы установить библиотеку, введите в терминал следующую команду.

Beautiful Soup поддерживает синтаксический анализатор HTML, включенный в стандартную библиотеку Python, но также поддерживает ряд сторонних синтаксических анализаторов Python. Одним из них является синтаксический анализатор lxml (используемый для анализа документов XML/HTML). lxml можно установить, выполнив следующую команду в командном процессоре вашей операционной системы:

Сначала мы научимся читать из XML-файла. Мы также будем анализировать данные, хранящиеся в нем. Позже мы научимся создавать файл XML и записывать в него данные.

Чтение данных из файла XML

Пример:

Используемый файл XML:

Питон3

ВЫВОД:

Запись XML-файла

Написание xml-файла — примитивный процесс, причина в том, что xml-файлы не кодируются особым образом. Для изменения разделов XML-документа сначала необходимо выполнить его синтаксический анализ. В приведенном ниже коде мы изменим некоторые разделы вышеупомянутого XML-документа.

Пример:

Питон3

Вывод:

Использование Elementree

Модуль Elementree предоставляет нам множество инструментов для работы с XML-файлами. Самое приятное в этом то, что он включен в стандартную встроенную библиотеку Python. Поэтому для этой цели не нужно устанавливать никаких внешних модулей. Поскольку формат xml по своей сути является иерархическим форматом данных, его намного проще представить в виде дерева. Модуль предоставляет ElementTree методы для представления всего XML-документа в виде единого дерева.

В следующих примерах мы рассмотрим дискретные методы чтения и записи данных в XML-файлы и из них.

Чтение XML-файлов

Чтобы прочитать файл XML с помощью ElementTree, во-первых, мы импортируем класс ElementTree, найденный в библиотеке xml, под именем ET (общее соглашение). Затем передал имя файла XML-файла методу ElementTree.parse(), чтобы включить анализ нашего XML-файла. Затем получили корень (родительский тег) нашего xml-файла с помощью getroot(). Затем отображается (распечатывается) корневой тег нашего xml-файла (неявным образом). Затем отобразил атрибуты вложенного тега нашего родительского тега, используя root[0].attrib. root[0] для первого тега родительского корня и attrib для получения его атрибутов. Затем мы отобразили текст, заключенный в 1-м вложенном теге 5-го вложенного тега корня тега.

Пример:

Питон3

Вывод:

Запись XML-файлов

Теперь мы рассмотрим некоторые методы, которые можно использовать для записи данных в XML-документ. В этом примере мы создадим XML-файл с нуля.

XML, или Extensible Markup Language, – это язык разметки, который обычно используется для структурирования, хранения и передачи данных между системами. Хотя это не так распространено, как раньше, оно по-прежнему используется в таких службах, как RSS и SOAP, а также для структурирования файлов, таких как документы Microsoft Office.

Поскольку Python является популярным языком для Интернета и анализа данных, вполне вероятно, что в какой-то момент вам понадобится читать или записывать XML-данные, и в этом случае вам повезло.

В этой статье мы в первую очередь рассмотрим модуль ElementTree для чтения, записи и изменения данных XML. Мы также сравним его со старым модулем minidom в первых нескольких разделах, чтобы вы могли получить хорошее сравнение этих двух модулей.

Модули XML

Минидом или минимальная реализация DOM – это упрощенная реализация объектной модели документа (DOM). DOM — это интерфейс прикладного программирования, который рассматривает XML как древовидную структуру, где каждый узел в дереве является объектом. Таким образом, использование этого модуля требует, чтобы мы были знакомы с его функциональностью.

Модуль ElementTree предоставляет более "питоновский" интерфейс для обработки XML и является хорошим вариантом для тех, кто не знаком с DOM. Он также, вероятно, лучше подходит для использования начинающими программистами из-за его простого интерфейса, который вы увидите в этой статье.

В этой статье модуль ElementTree будет использоваться во всех примерах, тогда как minidom также будет продемонстрирован, но только для подсчета и чтения XML-документов.

Пример файла XML

В приведенных ниже примерах мы будем использовать следующий файл XML, который мы сохраним как «items.xml»:

Как видите, это довольно простой пример XML, содержащий только несколько вложенных объектов и один атрибут. Однако этого должно быть достаточно, чтобы продемонстрировать все XML-операции, описанные в этой статье.

Чтение XML-документов

Использование минидома

Чтобы проанализировать XML-документ с помощью minidom, мы должны сначала импортировать его из модуля xml.dom. Этот модуль использует функцию разбора для создания объекта DOM из нашего файла XML. Функция разбора имеет следующий синтаксис:

Здесь имя файла может быть строкой, содержащей путь к файлу, или объектом типа файла. Функция возвращает документ, который можно обрабатывать как тип XML. Таким образом, мы можем использовать функцию getElementByTagName() для поиска определенного тега.

Поскольку каждый узел можно рассматривать как объект, мы можем получить доступ к атрибутам и тексту элемента, используя свойства объекта. В приведенном ниже примере мы получили доступ к атрибутам и тексту определенного узла и всех узлов вместе.

Результат следующий:

Если мы хотим использовать уже открытый файл, можем просто передать наш файловый объект для анализа следующим образом:

Кроме того, если бы XML-данные уже были загружены в виде строки, мы могли бы вместо этого использовать функцию parseString().

Использование ElementTree

ElementTree предлагает очень простой способ обработки XML-файлов. Как всегда, чтобы использовать его, мы должны сначала импортировать модуль. В нашем коде мы используем команду импорта с ключевым словом as, что позволяет нам использовать упрощенное имя (в данном случае ET) для модуля в коде.

После импорта мы создаем древовидную структуру с помощью функции синтаксического анализа и получаем ее корневой элемент. Получив доступ к корневому узлу, мы можем легко перемещаться по дереву, потому что дерево — это связный граф.

Используя ElementTree и, как и в предыдущем примере кода, мы получаем атрибуты узла и текст, используя объекты, связанные с каждым узлом.

Код выглядит следующим образом:

Результат будет следующим:

Как видите, это очень похоже на пример с минидомом. Одно из основных отличий состоит в том, что объект attrib — это просто объект словаря, что делает его немного более совместимым с другим кодом Python. Нам также не нужно использовать value для доступа к значению атрибута элемента, как мы это делали раньше.

Возможно, вы заметили, что доступ к объектам и атрибутам с помощью ElementTree немного больше похож на Python, как мы упоминали ранее. Это связано с тем, что XML-данные анализируются как простые списки и словари, в отличие от minidom, где элементы анализируются как пользовательские xml.dom.minidom.Attr и «текстовые узлы DOM».

Подсчет элементов XML-документа

Использование минидома

Как и в предыдущем случае, минидом должен быть импортирован из модуля dom. Этот модуль предоставляет функцию getElementsByTagName, которую мы будем использовать для поиска элемента тега. После получения мы используем встроенный метод len() для получения количества подэлементов, подключенных к узлу. Результат, полученный с помощью приведенного ниже кода, показан на рис. 3.

Имейте в виду, что это будет только подсчитывать количество дочерних элементов под нотой, для которой вы выполняете len(), которая в данном случае является корневым узлом. Если вы хотите найти все подэлементы в гораздо большем дереве, вам нужно обойти все элементы и подсчитать каждый из их дочерних элементов.

Использование ElementTree

Аналогичным образом модуль ElementTree позволяет нам рассчитать количество узлов, подключенных к узлу.

Результат следующий:

Написание XML-документов

Использование ElementTree

ElementTree также отлично подходит для записи данных в XML-файлы. В приведенном ниже коде показано, как создать файл XML с той же структурой, что и файл, который мы использовали в предыдущих примерах.

  1. Создайте элемент, который будет нашим корневым элементом. В нашем случае тег для этого элемента — «данные».
  2. После того, как у нас есть корневой элемент, мы можем создавать подэлементы с помощью функции SubElement. Синтаксис этой функции:

Подэлемент(родительский, тег, атрибут=<>, **дополнительно)

Здесь parent — родительский узел для подключения, attrib — словарь, содержащий атрибуты элемента, а extra — дополнительные аргументы ключевого слова. Эта функция возвращает нам элемент, который можно использовать для присоединения других подэлементов, как мы делаем в следующих строках, передавая элементы в конструктор SubElement.
3. Хотя мы можем добавить наши атрибуты с помощью функции SubElement, мы также можем использовать функцию set(), как мы делаем в следующем коде. Текст элемента создается с помощью свойства text объекта Element.
4. В последних 3 строках кода ниже мы создаем строку из XML-дерева и записываем эти данные в открываемый файл.

Бесплатная электронная книга: Git Essentials

Ознакомьтесь с нашим практическим руководством по изучению Git, включающим передовые практики, общепринятые стандарты и памятку. Перестаньте гуглить команды Git и на самом деле изучите их!

В результате выполнения этого кода будет создан новый файл "items2.xml", который должен быть эквивалентен исходному файлу "items.xml", по крайней мере, с точки зрения структуры данных XML. Вы, вероятно, заметите, что результирующая строка состоит только из одной строки и не содержит отступов.

Поиск элементов XML

Использование ElementTree

Модуль ElementTree предлагает функцию findall(), которая помогает нам находить определенные элементы в дереве. Он возвращает все элементы с указанным условием. Кроме того, в модуле есть функция find() , которая возвращает только первый подэлемент, соответствующий заданным критериям. Синтаксис обеих этих функций следующий:

Для обеих этих функций параметром соответствия может быть имя тега XML или путь. Функция findall() возвращает список элементов, а find возвращает один объект типа Element .

Кроме того, есть еще одна вспомогательная функция, которая возвращает текст первого узла, соответствующего заданному критерию:

Вот пример кода, показывающий, как именно работают эти функции:

А вот результат запуска этого кода:

Изменение элементов XML

Использование ElementTree

Модуль ElementTree предоставляет несколько инструментов для изменения существующих XML-документов. В приведенном ниже примере показано, как изменить имя узла, изменить имя атрибута и изменить его значение, а также как добавить дополнительный атрибут к элементу.

Текст узла можно изменить, указав новое значение в текстовом поле объекта узла. Имя атрибута можно переопределить с помощью функции set(name, value). Функция set не должна работать только с существующим атрибутом, ее также можно использовать для определения нового атрибута.

В приведенном ниже коде показано, как выполнять эти операции:

После запуска кода результирующий файл XML "newitems.xml" будет иметь дерево XML со следующими данными:

Как видно при сравнении с исходным XML-файлом, имена элементов элемента данных изменились на "newitem", текст на "new text" и к обоим узлам был добавлен атрибут "name2".< /p>

Вы также можете заметить, что запись XML-данных таким способом (вызов tree.write с именем файла) добавляет к дереву XML дополнительное форматирование, поэтому оно содержит новые строки и отступы.

Создание подэлементов XML

Использование ElementTree

В модуле ElementTree есть несколько способов добавления нового элемента. Первый способ, который мы рассмотрим, — это использование функции makeelement(), которая имеет имя узла и словарь с его атрибутами в качестве параметров.

Второй способ — через класс SubElement(), который принимает родительский элемент и словарь атрибутов в качестве входных данных.

В нашем примере ниже показаны оба метода. В первом случае у узла нет атрибутов, поэтому мы создали пустой словарь ( attrib = <> ). Во втором случае мы используем заполненный словарь для создания атрибутов.

После выполнения этого кода результирующий файл XML будет выглядеть следующим образом:

Как видно при сравнении с исходным файлом, были добавлены элемент "seconditems" и его подэлемент "seconditem". Кроме того, узел "seconditem" имеет атрибут "name2" и его текст "seconditemabc", как и ожидалось.

Удаление XML-элементов

Использование ElementTree

Как и следовало ожидать, модуль ElementTree обладает необходимой функциональностью для удаления атрибутов узла и вложенных элементов.

Удаление атрибута

В приведенном ниже коде показано, как удалить атрибут узла с помощью функции pop(). Функция применяется к параметру объекта атрибута. Он указывает имя атрибута и устанавливает для него значение None .

Результатом будет следующий файл XML:

Как видно из кода XML выше, первый элемент не имеет атрибута "имя".

Удаление одного вложенного элемента

Один конкретный подэлемент можно удалить с помощью функции удаления. Эта функция должна указать узел, который мы хотим удалить.

В следующем примере показано, как его использовать:

Результатом будет следующий файл XML:

Как видно из XML-кода выше, теперь есть только один узел "item". Второй был удален из исходного дерева.

Удаление всех подэлементов

Модуль ElementTree предоставляет нам функцию clear(), которую можно использовать для удаления всех подэлементов данного элемента.

Пример ниже показывает, как использовать clear() :

Результатом будет следующий файл XML:

Как видно из приведенного выше XML-кода, все подэлементы элемента "items" были удалены из дерева.

Подведение итогов

Python предлагает несколько вариантов обработки XML-файлов. В этой статье мы рассмотрели модуль ElementTree и использовали его для анализа, создания, изменения и удаления файлов XML. Мы также использовали модель minidom для разбора XML-файлов. Лично я рекомендую использовать модуль ElementTree, так как с ним гораздо проще работать и он является более современным модулем из двух.

XML означает расширяемый язык разметки. Он был разработан для хранения и передачи небольших и средних объемов данных и широко используется для обмена структурированной информацией.

Python позволяет анализировать и изменять XML-документ. Чтобы разобрать XML-документ, вам нужно иметь весь XML-документ в памяти. В этом руководстве мы увидим, как мы можем использовать класс XML minidom в Python для загрузки и анализа XML-файла.

В этом уроке мы узнаем-

Как анализировать XML с помощью minidom

Мы создали образец XML-файла, который собираемся проанализировать.

Шаг 1) Внутри файла мы можем увидеть имя, фамилию, дом и область знаний (SQL, Python, тестирование и бизнес)


Шаг 2) После анализа документа мы распечатаем «имя узла» корня документа и «имя первого дочернего элемента». Имя тега и имя узла являются стандартными свойствами файла XML.

Примечание:

Имя узла и дочерний тэг — это стандартные имена или свойства XML-дома. В случае, если вы не знакомы с такими соглашениями об именах.

Шаг 3) Мы также можем вызвать список тегов XML из документа XML и распечатать. Здесь мы распечатали набор навыков, таких как SQL, Python, тестирование и бизнес.

  • Объявить переменную экспертизу, из которой мы собираемся извлечь всю экспертизу имени сотрудника
  • Используйте стандартную функцию dom под названием «getElementsByTagName».
  • Это позволит получить все элементы с именем навык
  • Объявить цикл для каждого из тегов навыков.
  • Запустите код. Он выдаст список из четырех навыков.

Как создать узел XML

Мы можем создать новый атрибут с помощью функции «createElement», а затем добавить этот новый атрибут или тег к существующим тегам XML. Мы добавили новый тег «BigData» в наш файл XML.

  1. Чтобы добавить новый атрибут (BigData) в существующий тег XML, необходимо написать код.
  2. Затем вам нужно распечатать тег XML с новыми атрибутами, добавленными к существующему тегу XML.

  • Чтобы добавить новый XML и добавить его в документ, мы используем код «элементы doc.create»
  • Этот код создаст новый тег навыка для нашего нового атрибута «Большие данные».
  • Добавить этот тег навыка в первый дочерний элемент документа (сотрудник)
  • Запустите код — появится новый тег «большие данные» с другим списком знаний.

Пример анализатора XML

Пример Python 2

Пример Python 3

Как анализировать XML с помощью ElementTree

ElementTree – это API для работы с XML. ElementTree — это простой способ обработки XML-файлов.

В качестве примера данных мы используем следующий XML-документ:

Чтение XML с помощью ElementTree:

сначала мы должны импортировать модуль xml.etree.ElementTree.

Теперь давайте извлечем корневой элемент:

вывод:

Обзор:

Python позволяет анализировать весь XML-документ за один раз, а не по одной строке за раз. Для анализа XML-документа вам необходимо иметь весь документ в памяти.

Читайте также: