XML wird nicht gespeichert

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
djangofish
User
Beiträge: 51
Registriert: Dienstag 16. Oktober 2012, 09:43
Kontaktdaten:

Hallo zusammen,

irgendwie werden meine Änderungen an einer XML-Datei nicht gespeichert. Im Prinzip will ich einige Tags mit re.sub löschen bzw. ändern. Aber anscheinend werde die Änderungen am Ende nicht in die XML geschrieben.

Die RegEx hab ich mit dem internen Tool von PyCharm und mit einem Web-Tool getestet. Die sollten in Ordnung sein.

Code: Alles auswählen

    def parseXMLtest(self, xdata):

        for t in xdata.findall('.//property[@name="body"]'):

            if t.text.lower().find("cdata") > -1:
                t.text = re.sub(r"s/<ac:structured-macro ac:name=\"jira\"*[^>]*>(.+?)<\/ac:structured-macro>", r"\1", t.text)
                #print("NODDATA", t.text)
                t.text = re.sub("<ac:parameter ac:name=\"server\"*[^>]*>(.+?)<\/ac:parameter>", "", t.text)
                col = re.compile("<ac:parameter ac:name=\"columns\"*[^>]*>(.+?)<\/ac:parameter>")
                print(re.findall(col, t.text))
                t.text = re.sub(col, '', t.text)
                t.text = re.sub("<ac:parameter ac:name=\"key\"[^>]*>(.+?)<\/ac:parameter>", r"\1", t.text)
                t.text = re.sub(r'<ac:parameter ac:name=\"serverId\"[^>]*>(.+?)<\/ac:parameter>', '', t.text)

        now = datetime.now()
        date_time = now.strftime("%m%d%Y_%H-%M-%S")
        fname = date_time+".xml"
        xdata.write(fname, pretty_print=True)
Eine andere Sache ist, das die zu ändernden Stellen als CDATA in einem tag.text liegen. Vielleicht wird etwas beim Einlesen geändert, aber dann würde eine keine erfolgreiche Konsolenausgabe geben


Grüße
PEter
Benutzeravatar
__blackjack__
User
Beiträge: 14007
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@djangofish: Das sieht aus als würdest Du XML mit regulären Ausdrücken bearbeiten wollen. Das ist schon mal der erste Fehler. Selbst wenn Du da Zeichenketten mit XML hättest, verarbeitet man XML nicht als unstrukturierten Text, denn das ist kein unstrukturierter Text, deswegen hat man ja extra XML genommen, und es funktioniert auch nicht wirklich. Es mag für Teilmengen von XML funktionieren, aber dann musst Du auch sicher sein, dass Du genau so eine Teilmenge hast und da nichts kaputt machst. Das kannst Du aber nicht ohne das XML zu parsen. Und wenn Du das XML parst, dann brauchst Du auch nicht so eine Krücke wie reine Textoperationen auf XML, sondern kannst auch tatsächlich mit der Struktur arbeiten.

Und Du hast ja anscheinend bereits keinen Text mehr, sondern einen Parser verwendet, wenn ich den ersten `findall()`-Aufruf auf `xdata` richtig interpretiere.

Solltest Du da doch XML als Zeichenkette haben, weil jemand XML als Text in XML gesteckt hat: Dann parse das ordentlich als XML und geh da nicht mit Zeichenkettenoperationen ran.

Das muss anscheinend auch gar keine Methode sein, warum ist das dann nicht einfach eine Funktion? Und es vermischt die Verarbeitung der Daten mit dem Speichern. Das macht es schwieriger Tests dafür zu schreiben.

Das „escapen“ von " in den Ausdrücken ist nervig und in Python fast nie wirklich notwendig weil es so viele Möglichkeiten gibt Zeichenkettenliterale zu begrenzen, dass es wirklich *sehr* selten ist, das eine Zeichenkette *alle* diese Möglichkeiten *beinhaltet*. Denn nur dann ist es ja tatsächlich notwendig mit \ zu operieren.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten