Módulo para trabajar con archivos XML

Qué hacemos



Hoy crearemos un módulo para trabajar con archivos XML .



Para qué



A veces, al desarrollar un programa en Python, es necesario realizar configuraciones que cualquier usuario pueda cambiar sin cambiar el código.



Qué necesitamos



  • Conocimiento de la programación de Java Python
  • Python3
  • Biblioteca xml de Python


Empecemos



Primero, importemos la biblioteca y creemos la clase principal.



import xml.etree.ElementTree as xml

class XML:
    pass


Para trabajar con un archivo XML, necesitamos el archivo XML en sí, pero en la primera ejecución del programa, es posible que el usuario no tenga este archivo, por lo que debemos crearlo.



Al crear una instancia de la clase, pase el nombre del archivo y guárdelo en el parámetro fileName.



import xml.etree.ElementTree as xml

class XML:
    fileName:str

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


Ahora escribiremos una función que comprobará si nuestro archivo existe y lo llamará en el momento de crear una instancia de la clase.



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 continuación, escribiremos una función que creará nuestro archivo si no existe, y la llamaremos si el programa no encuentra el archivo.



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


Ahora echemos un vistazo más de cerca a la función XML.createFile ():



  • rootXML es el elemento principal que permitirá escribir todas las configuraciones en un nuevo archivo mucho más rápido que si escribiéramos todas las etiquetas por separado
  • texto es la etiqueta que se mostrará dentro de rootXML. En el campo de texto del elemento, especifique lo que debe estar dentro del elemento


Para hacer una lista de elementos, por ejemplo:



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


Cree un elemento principal, en nuestro caso "lista" y subelementos "elemento".



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


Si nuestro programa es un programa con una interfaz, y el archivo de configuración se usa para almacenar cualquier valor que el usuario pueda cambiar, entonces necesitamos una función que pueda cambiar el valor de un elemento. Escribámoslo.



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)


En la función editFile () pasamos el nombre del elemento (elemento) que queremos cambiar y el nuevo valor (valor).



Y lo último que necesita para trabajar con archivos XML es el análisis de datos.



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


En el método parsingFile (), pasamos el nombre de la etiqueta (elemento) que queremos recibir y el valor booleano de qué tipo de datos devolver. Si text = True, se devolverá el valor del elemento; de lo contrario, el objeto, que luego se puede iterar. Por ejemplo, tenemos un archivo XML:



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


Y si queremos mostrar todos los valores de los elementos en la consola, analizamos el parámetro "list" y pasamos False en el segundo parámetro a parsingFile (). Comenzamos a iterar sobre el elemento recibido y mostrar el texto del elemento, que tiene el valor del elemento seleccionado.



import XML as xml

moduleXml = xml.XML("settings")

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


Luego de ejecutar este código en la consola, veremos:



1
2
3


Conclusión



Como resultado, obtuvimos un módulo que se puede usar en sus proyectos para trabajar con archivos XML.



Proyecto en gitHub



Gracias a todos y buena suerte.



All Articles