Python прочитать xml файл

Обновлено: 04.07.2024

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

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

В этой статье мы в первую очередь рассмотрим модуль ElementTree для чтения, записи и изменения данных XML в Python.

Модули XML

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Подсчет элементов

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

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

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

Запись

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

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

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

Здесь parent – это родительский узел, к которому нужно подключиться, attrib – это словарь, содержащий атрибуты элемента, а extra – дополнительные аргументы ключевого слова. Эта функция возвращает нам элемент, который можно использовать для присоединения других подэлементов, как мы это делаем в следующих строках, передавая элементы в конструктор SubElement.

3. Хотя мы можем добавлять наши атрибуты с помощью функции SubElement, мы также можем использовать функцию set(), как мы это делаем в следующем коде. Текст элемента создается с помощью свойства text объекта Element.

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

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

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

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

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

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

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

И вот повторное использование этого кода:

Изменение

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

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

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

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

Как мы можем видеть при сравнении с исходным XML-файлом, имена элементов item изменились на «newitem», текст на «новый текст», а атрибут «name2» был добавлен к обоим узлам.

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

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

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

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

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

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

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

Удаление

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

Модули XML

Minidom ,‭ ‬или Minimal DOM Implementation‭ – ‬это упрощённая‭ ‬реализация объектной модели документа‭ (‬Document Object Model,‭ ‬DOM‭)‬.‭ ‬DOM‭ – ‬это интерфейс программирования приложений‭ (‬Application Programming Interface,‭ ‬API‭)‬,‭ ‬рассматривающий XML как древовидную структуру,‭ ‬где каждый узел в дереве есть объект.‭ ‬Таким образом,‭ ‬использование этого модуля требует,‭ ‬чтобы мы были знакомы с его функциональностью.

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

Здесь во всех примерах будет использован модуль ElementTree ,‭ ‬хотя minidom тоже будет представлен,‭ ‬но только для подсчёта и чтения документов XML.

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

Как вы можете видеть,‭ ‬это весьма простой пример XML,‭ ‬содержащий лишь немного вложенных объектов и один атрибут.‭ ‬Хотя этого должно быть достаточно,‭ ‬чтобы показать все операции с XML в этой статье.

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

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

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

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

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

Результат выглядит так:

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

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

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

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

Вслед за импортом мы создаём структуру дерева при помощи функции parse и получаем его корневой элемент.‭ ‬Как только добрались до корневого узла,‭ ‬мы можем легко путешествовать по дереву,‭ ‬поскольку оно является связным графом.

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

Код выглядит так:‭

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

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

Вы могли заметить,‭ ‬то доступ к объектам и атрибутам с ElementTree чуть более‭ «‬питоний‭»‬,‭ ‬как мы упоминали ранее.‭ ‬Дело в том,‭ ‬что данные XML обрабатываются как простые списки и словари,‭ ‬в отличие от minidom ,‭ ‬где применяется xml.dom.minidom.Attr и‭ «‬текстовые узлы DOM‭»‬.

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

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

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

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

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

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

Результат выглядит так:

Запись документов XML

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

После запуска кода итоговый файл XML будет выглядеть так:

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

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

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

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

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

В итоге получится следующий файл XML:

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

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

Следующий пример показывает её использование:

В итоге получим следующий файл XML:

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

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

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

В итоге будет следующий файл XML:

Подведём итоги

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

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

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

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

Модули XML

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

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

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

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

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

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

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

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

В результате получается следующее:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В результате получается следующее:

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

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

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

ПодЭлемент(parent, tag, attrib=<>, **extra)

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

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

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

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

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

Вот несколько примеров кода, чтобы показать вам, как именно работают эти функции:

И вот результат выполнения этого кода:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обертывание

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

Сегодня мы с Вами сделаем модуль для работы с XML файлами.

Зачем

Иногда при разработке программы на Python требуется сделать настройки, которые сможет поменять любой пользователь без изменения кода.

Что нам понадобится

  • Знание ЯП Python
  • Python3
  • Python библиотека xml

Начнем

Для начала импортируем библиотеку и создадим основной класс.


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

При создание экземпляра класса передадим имя файла и сохраним его в параметр fileName.


Теперь напишем функцию, которая будет проверять существует ли наш файл и будем вызывать ее в момент создания экземпляра класса.


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


Теперь более подробно разберем функцию XML.createFile():

  • rootXML — это основной элемент, который позволит записать все настройки в новый файл гораздо быстрее чем, если бы мы записывали все теги по отдельности
  • text — тег, который будет отображаться внутри rootXML. В поле Element.text указываем, что должно быть внутри элемента


Создайте главный элемент, в нашем случаи «list» и субэлементы «item».


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


В функцию editFile() мы передаем имя элемента(element), который хотим изменить и новое значение(value).

И последнее, что нужно для любой работы с XML файлами — это парсинг данных.


В метод parsingFile() мы передаем имя тега(element), который хотим получить и boolean значение какой тип данных нам вернуть. Если text = True то вернется значение элемента, иначе объект, который после можно будет перебрать. Например у нас есть XML файл:


И если мы хотим вывести в консоль все значения item, то мы парсим параметр «list» и в parsingFile() 2-м параметром передаем False. Начинаем перебирать полученный элемент и выводить element.text — имеющий значение выбранного элемента.


После выполнения данного кода в консоли мы увидим:

Заключение

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

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