Módulo para trabalhar com arquivos XML

O que nós fazemos



Hoje vamos criar um módulo para trabalhar com arquivos XML .



Pelo que



Às vezes, ao desenvolver um programa em Python, você precisa fazer configurações que qualquer usuário pode alterar sem alterar o código.



O que nós precisamos



  • Conhecimento da linguagem de programação Python
  • Python3
  • Biblioteca xml Python


Vamos começar



Primeiro, vamos importar a biblioteca e criar a classe principal.



import xml.etree.ElementTree as xml

class XML:
    pass


Para trabalhar com um arquivo XML, precisamos do próprio arquivo XML, mas na primeira inicialização do programa, o usuário pode não ter esse arquivo, portanto, precisamos criá-lo.



Ao criar uma instância da classe, passe o nome do arquivo e armazene-o no parâmetro nomArquivo.



import xml.etree.ElementTree as xml

class XML:
    fileName:str

    def __init__(self, fileName):
        self.fileName = fileName + ".xml"


Agora escreveremos uma função que verificará se nosso arquivo existe e o chamará na hora de criar uma instância da classe.



import xml.etree.ElementTree as 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:
            print("File not found")


A seguir, escreveremos uma função que criará nosso arquivo se ele não existir e a chamaremos se o programa não encontrar o arquivo.



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()


Agora vamos dar uma olhada mais de perto na função XML.createFile ():



  • rootXMLéo elemento principal que permitirá gravar todas as configurações em um novo arquivo muito mais rápido do que se escrevêssemos todas as tags separadamente
  • text é a tag que será exibida dentro do rootXML. No campo Element.text, especifique o que deve estar dentro do elemento


Para fazer uma lista de itens, por exemplo:



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


Crie um elemento principal, em nosso caso "lista" e subelementos "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)
#     


Se nosso programa é um programa com uma interface e o arquivo de configurações é usado para armazenar quaisquer valores que o usuário pode alterar, então precisamos de uma função que pode alterar o valor de um elemento. Vamos escrever.



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)


Na função editFile (), passamos o nome do elemento (elemento) que queremos alterar e o novo valor (valor).



E a última coisa que você precisa para qualquer trabalho com arquivos XML é a análise de dados.



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


No método parsingFile (), passamos o nome da tag (elemento) que queremos receber e o valor booleano de qual tipo de dado retornar. Se text = True então o valor do elemento será retornado, caso contrário, o objeto, que pode então ser iterado. Por exemplo, temos um arquivo XML:



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


E se quisermos exibir todos os valores dos itens no console, analisamos o parâmetro "list" e passamos False no segundo parâmetro para parsingFile (). Começamos a iterar sobre o elemento recebido e exibir element.text - tendo o valor do elemento selecionado.



import XML as xml

moduleXml = xml.XML("settings")

for element in moduleXml.parsingFile("list", False):
    print(element.text)


Depois de executar este código no console, veremos:



1
2
3


Conclusão



Como resultado, obtivemos um módulo que pode ser utilizado em seus projetos para trabalhar com arquivos XML.



Projeto no gitHub



Obrigado a todos e boa sorte.



All Articles