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

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
17-Сен-2020 23:30

Что будем делать
Сегодня мы с Вами сделаем модуль для работы с 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
Всем спасибо и удачи.
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_python, #_xml, #_python3, #_xml, #_tutorial, #_python, #_xml
Профиль  ЛС 
Показать сообщения:     

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

Текущее время: 25-Ноя 05:10
Часовой пояс: UTC + 5