Modul zum Arbeiten mit XML-Dateien

Was machen wir



Heute werden wir ein Modul für die Arbeit mit XML- Dateien erstellen .



Wozu



Wenn Sie ein Programm in Python entwickeln, müssen Sie manchmal Einstellungen vornehmen, die jeder Benutzer ändern kann, ohne den Code zu ändern.



Was brauchen wir



  • Kenntnisse in der Java-Programmierung Python
  • Python3
  • Python-XML-Bibliothek


Lasst uns beginnen



Importieren wir zunächst die Bibliothek und erstellen die Hauptklasse.



import xml.etree.ElementTree as xml

class XML:
    pass


Um mit einer XML-Datei arbeiten zu können, benötigen wir die XML-Datei selbst. Beim ersten Start des Programms verfügt der Benutzer möglicherweise nicht über diese Datei. Daher müssen wir sie erstellen.



Übergeben Sie beim Erstellen einer Instanz der Klasse den Dateinamen und speichern Sie ihn im Parameter fileName.



import xml.etree.ElementTree as xml

class XML:
    fileName:str

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


Jetzt schreiben wir eine Funktion, die prüft, ob unsere Datei vorhanden ist, und sie zum Zeitpunkt der Erstellung einer Instanz der Klasse aufruft.



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


Als nächstes schreiben wir eine Funktion, die unsere Datei erstellt, wenn sie nicht vorhanden ist, und rufen sie auf, wenn das Programm die Datei nicht findet.



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


Schauen wir uns nun die Funktion XML.createFile () genauer an:



  • rootXML ist das Hauptelement, mit dem alle Einstellungen viel schneller in eine neue Datei geschrieben werden können, als wenn alle Tags separat geschrieben würden
  • Text ist das Tag, das in rootXML angezeigt wird. Geben Sie im Feld Element.text an, was sich im Element befinden soll


So erstellen Sie eine Liste mit Elementen:



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


Erstellen Sie ein Hauptelement, in unserem Fall "Liste" und Unterelemente "Element".



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


Wenn unser Programm ein Programm mit einer Schnittstelle ist und die Einstellungsdatei zum Speichern von Werten verwendet wird, die der Benutzer ändern kann, benötigen wir eine Funktion, die den Wert eines Elements ändern kann. Lass es uns schreiben.



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)


In der Funktion editFile () übergeben wir den Namen des Elements (Elements), das wir ändern möchten, und den neuen Wert (value).



Und das Letzte, was Sie für die Arbeit mit XML-Dateien benötigen, ist das Parsen von Daten.



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


In der parsingFile () -Methode übergeben wir den Namen des Tags (Elements), das wir empfangen möchten, und den booleschen Wert, dessen Datentyp zurückgegeben werden soll. Wenn text = True, wird der Wert des Elements zurückgegeben, andernfalls das Objekt, über das dann iteriert werden kann. Zum Beispiel haben wir eine XML-Datei:



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


Und wenn wir alle Elementwerte für die Konsole anzeigen möchten, analysieren wir den Parameter "list" und übergeben False im zweiten Parameter an parsingFile (). Wir beginnen, über das empfangene Element zu iterieren und element.text anzuzeigen - mit dem Wert des ausgewählten Elements.



import XML as xml

moduleXml = xml.XML("settings")

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


Nachdem Sie diesen Code in der Konsole ausgeführt haben, sehen wir:



1
2
3


Fazit



Als Ergebnis haben wir ein Modul, das in Ihren Projekten für die Arbeit mit XML-Dateien verwendet werden kann.



Projekt auf gitHub



Vielen Dank und viel Glück.



All Articles