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.