Модуль для работы с XML файлами

от автора

Что будем делать

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

Зачем

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

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

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

Начнем

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

import xml.etree.ElementTree as xml import time  class XML:     pass 

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

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

import xml.etree.ElementTree as xml import time  class XML:     fileName:str      def __init__(self, fileName):         self.fileName = fileName + ".xml" 

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

import xml.etree.ElementTree as xml import time  class XML:     fileName:str      def __init__(self, fileName):         self.fileName = fileName + ".xml"         self.openFile()      def openFile(self):         try:             file = open(self.fileName, "r")         except FileNotFoundError:             print("File not found") 

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

class XML:     fileName:str      def __init__(self, fileName):         self.fileName = fileName + ".xml"         self.openFile()      def openFile(self):         try:             file = open(self.fileName, "r")         except FileNotFoundError:             self.createFile()      def createFile(self):         rootXML = xml.Element("settings")          text = xml.Element("text")         text.text = "Text"         rootXML.append(text)          file = open(self.fileName, "w")         file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8"))         file.close() 

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

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

Для того, чтобы сделать список элементов, например:

<settings>     <text>Hello, world!</text>     <list>         <item>1</item>         <item>2</item>         <item>3</item>     </list> </settings> 

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

list = xml.Element("list") rootXML.append(list)  item: xml.SubElement  item = xml.SubElement(list, "item") item.text = "1"  item = xml.SubElement(list, "item") item.text = "2"  item = xml.SubElement(list, "item") item.text = "3"  #xml.SubElement(parent: xml.Element or xml.SubElement, tag: str) #Также можно сделать субэлемент в субэлементе 

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

class XML:     fileName:str      def __init__(self, fileName):         self.fileName = fileName + ".xml"         self.openFile()      def openFile(self):         try:             file = open(self.fileName, "r")         except FileNotFoundError:             self.createFile()      def createFile(self):         rootXML = xml.Element("settings")          text = xml.Element("text")         text.text = "Text"         rootXML.append(text)          file = open(self.fileName, "w")         file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8"))         file.close()      def editFile(self, element, value):         tree = xml.ElementTree(file=self.fileName)         rootXML = tree.getroot()         for elem in rootXML.iter(element):             elem.text = str(value)          tree = xml.ElementTree(rootXML)         tree.write(self.fileName) 

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

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

class XML:     fileName:str      def __init__(self, fileName):         self.fileName = fileName + ".xml"         self.openFile()      def openFile(self):         try:             file = open(self.fileName, "r")         except FileNotFoundError:             self.createFile()      def createFile(self):         rootXML = xml.Element("settings")          text = xml.Element("text")         text.text = "Text"         rootXML.append(text)          file = open(self.fileName, "w")         file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8"))         file.close()      def editFile(self, element, value):         tree = xml.ElementTree(file=self.fileName)         rootXML = tree.getroot()         for elem in rootXML.iter(element):             elem.text = str(value)          tree = xml.ElementTree(rootXML)         tree.write(self.fileName)      def parsingFile(self, elements, text = True):         tree = xml.ElementTree(file=self.fileName)         rootXML = tree.getroot()         for element in rootXML.iter(elements):             if (text):                 return element.text             return element 

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

<settings>     <text>Hello, world!</text>     <list>         <item>1</item>         <item>2</item>         <item>3</item>     </list> </settings> 

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

import XML as xml  moduleXml = xml.XML("settings")  for element in moduleXml.parsingFile("list", False):     print(element.text) 

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

1 2 3 

Заключение

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

Проект на gitHub

Всем спасибо и удачи.

ссылка на оригинал статьи https://habr.com/ru/post/519604/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *