Русский
Русский
English
Статистика
Реклама

Из песочницы Модуль для работы с XML файлами

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


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

Зачем


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

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


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

Начнем


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

import xml.etree.ElementTree as xmlimport timeclass XML:    pass

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

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

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

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

import xml.etree.ElementTree as xmlimport timeclass 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.SubElementitem = 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 xmlmoduleXml = xml.XML("settings")for element in moduleXml.parsingFile("list", False):    print(element.text)

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

123

Заключение


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

Проект на gitHub

Всем спасибо и удачи.
Источник: habr.com
К списку статей
Опубликовано: 17.09.2020 20:15:16
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Python

Xml

Python3

Tutorial

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru