Module pour travailler avec des fichiers XML

Qu'est-ce qu'on fait



Aujourd'hui, nous allons créer un module pour travailler avec des fichiers XML .



Pourquoi



Parfois, lors du développement d'un programme en Python, vous devez définir des paramètres que tout utilisateur peut modifier sans changer le code.



De quoi avons nous besoin



  • Connaissance de la programmation Java Python
  • Python3
  • Bibliothèque XML Python


Commençons



Tout d'abord, importons la bibliothèque et créons la classe principale.



import xml.etree.ElementTree as xml

class XML:
    pass


Pour travailler avec un fichier XML, nous avons besoin du fichier XML lui-même, mais au premier lancement du programme, l'utilisateur peut ne pas avoir ce fichier, nous devons donc le créer.



Lors de la création d'une instance de la classe, transmettez le nom du fichier et stockez-le dans le paramètre fileName.



import xml.etree.ElementTree as xml

class XML:
    fileName:str

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


Nous allons maintenant écrire une fonction qui vérifiera si notre fichier existe et l'appellera au moment de la création d'une instance de la 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")


Ensuite, nous écrirons une fonction qui créera notre fichier s'il n'existe pas, et nous l'appellerons si le programme ne trouve pas le fichier.



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


Examinons maintenant de plus près la fonction XML.createFile ():



  • rootXML est l'élément principal qui permettra d'écrire tous les paramètres dans un nouveau fichier beaucoup plus rapidement que si nous écrivions toutes les balises séparément
  • text est la balise qui sera affichée dans rootXML. Dans le champ Element.text, spécifiez ce qui doit être à l'intérieur de l'élément


Pour faire une liste d'articles, par exemple:



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


Créez un élément principal, dans notre cas "liste" et sous-éléments "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)
#     


Si notre programme est un programme avec une interface et que le fichier de paramètres est utilisé pour stocker toutes les valeurs que l'utilisateur peut modifier, nous avons besoin d'une fonction capable de modifier la valeur d'un élément. Écrivons-le.



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)


Dans la fonction editFile (), nous passons le nom de l'élément (élément) que nous voulons changer et la nouvelle valeur (valeur).



Et la dernière chose dont vous avez besoin pour travailler avec des fichiers XML est l'analyse des données.



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


Dans la méthode parsingFile (), on passe le nom de la balise (élément) que l'on souhaite recevoir et la valeur booléenne du type de données à renvoyer. Si text = True, la valeur de l'élément sera renvoyée, sinon l'objet, qui peut ensuite être itéré. Par exemple, nous avons un fichier XML:



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


Et si nous voulons afficher toutes les valeurs de item sur la console, alors nous analysons le paramètre "list" et passons False comme 2ème paramètre dans parsingFile (). Nous commençons à parcourir l'élément reçu et à afficher element.text - ayant la valeur de l'élément sélectionné.



import XML as xml

moduleXml = xml.XML("settings")

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


Après avoir exécuté ce code dans la console, nous verrons:



1
2
3


Conclusion



En conséquence, nous avons un module qui peut être utilisé dans vos projets pour travailler avec des fichiers XML.



Projet sur gitHub



Merci à tous et bonne chance.



All Articles