Umlaute im XML

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
TVpy
User
Beiträge: 7
Registriert: Samstag 5. Dezember 2009, 15:06

Hallo zusammen,

ich hab jetzt schon einige Einträge zu XML, Unicods und Umlaute gelesen, aber ich bekomm mein Prolbem trotzdem nicht in den Griff.

Ich hab eine GUI in wxPython programmiert. Von der ich die vom User eingegebenen Daten in einem xml-File speicher. Zum speichern wandle ich den unicode-String von der GUI in UTF-8 um. Dabei wird mir z. B. ein ä in À umgewandelt.
Gibt es eine Möglichkeit das im xml-File das ä als ä dargestellt wird, da das xml-File auch mal direkt durch den User gelesen wird und das lesen durch À usw. etwas erschert wird.

Zum Testen hab ich folgendes kleines Script verwendet, evtl. mach ich einen Fehler den ich übersehe.

Code: Alles auswählen

# -*- coding: ISO-8859-1 -*-
import xml.dom.minidom as dom

if __name__=='__main__':
	
	str_path = 'C:\\test.xml'
	
	a = u'Test: äää'
	
	b = a.encode('utf-8')		
	
    # xml erstellen
	d = dom.Document()
	r = dom.Element('test')
	r.appendChild(d.createTextNode(b))
	d.appendChild(r)
	
	file_xml = file(str_path, 'w')
	d.writexml(file_xml, '', '\t', '\n')
	file_xml.close()

##
## das erstellte xml:
##<?xml version="1.0" ?>
##<test> Test: ÀÀÀ </test>
##

    # xml auslesen
	tree = dom.parse(str_path)
	tag = tree.firstChild
	c = tag.firstChild.data
	
	print type(c)
	d = c.encode('iso-8859-15')
	print d    #=  Test: äää


Ich sag schon mal danke.

Gruß
Markus

PS: Und warum kann ich den Unicod-String den ich von der GUI erhalte nicht direkt ins xml schreiben, xml besteht ja auch aus Unicodes.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

TVpy hat geschrieben: Gibt es eine Möglichkeit das im xml-File das ä als ä dargestellt wird, da das xml-File auch mal direkt durch den User gelesen wird und das lesen durch À usw. etwas erschert wird.
Wenn man es denn in einem Editor, der utf-8 einlesen und darstellen kann, sehe ich kein Problem! Jeder brauchbare Editor sollte beim Laden eigentlich die Otpion anbieten, das Encoding manuell festzulegen.
PS: Und warum kann ich den Unicod-String den ich von der GUI erhalte nicht direkt ins xml schreiben, xml besteht ja auch aus Unicodes.
Das hängt doch eher vom verwendeten XML-Modul ab; lxml etwa hat imho recht guten Unicode-Support.

Ich glaube ja, Du verwechselst Unicode immer noch mit utf-8 oder anderen encodings. Hast Du dir mal die Slides von Leonidas angeguckt? Mir hat das Lesen davon erst das Verständnis für den Unterschied zwischen Unicode und Encodings gebracht.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Man braucht kein lxml für etree

Ich verwende das hier:

Code: Alles auswählen

for mod in ['lxml.etree', 'lxml.cElementTree', 'cElementTree',
            'elementtree.ElementTree', 'xml.etree.cElementTree']:
    try:
        globals()['etree'] = __import__(mod, fromlist=[mod.split('.')[-1]])
    except ImportError:
        pass
    else:
        break
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dav1d hat geschrieben:Man braucht kein lxml für etree
Stimmt! Hat das jemand behauptet?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Nein, aber wenn er lxml schreibt denkt man gleich an etree, bzw. wenn man etree schreibt gleich an lxml, obwohl es in der Std-Lib so einen schönen cElementTree gibt, vom "normalen" etree rate ich ab, der "normale" etree verwendet Expat und Expat hasst Fehler in XML-Datein => sobald es einen ganz winzig kleinen Fehler im XML gibt, wirft Expat eine Exception, deshalb lieber cElementTree
the more they change the more they stay the same
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dav1d hat geschrieben:[...] vom "normalen" etree rate ich ab, der "normale" etree verwendet Expat und Expat hasst Fehler in XML-Datein => sobald es einen ganz winzig kleinen Fehler im XML gibt, wirft Expat eine Exception, deshalb lieber cElementTree
Das wäre für mich eher ein Grund für etree.

Eine Argumentation der Art "Bei kaputten Daten meldet mir das Modul einen Fehler und deshalb benutze ich es nicht" will sich mir nicht recht als schlüssig präsentieren.
lunar

@Dav1d: Ein XML-Parser hat nur und ausschließlich gültiges XML zu akzeptieren. Ist das XML fehlerhaft, und sei der Fehler noch so klein, dann hat der Parser eine Ausnahme auszulösen. Ansonsten ist der Parser schlicht kaputt …

Davon abgesehen glaube ich nicht so recht, dass es XML gibt, dass cElementTree akzeptiert, während es von expat (ElementTree) oder libxml (lxml) nicht akzeptiert wird. Kannst Du dafür mal ein Beispiel zeigen, oder wenigstens einen Blog-Eintrag oder irgendeinen Artikel zitieren?
TVpy
User
Beiträge: 7
Registriert: Samstag 5. Dezember 2009, 15:06

Hallo,

erst mal danke für eure Hilfe!

Nach ca. acht Stunden testen und ausprobieren hab ich wohl den Überblick verloren. Doch dank dem Hinweis von Hyperion mit dem Viewer hab ich meinen Fehler gefunden.
Ich hab nicht nur im Skript (encode, decode) sondern auch im Viewer die verschiedenen codings ausprobiert. Und irgenwann wollte dieser anscheinend nicht mehr. Nach einem Neustart des Viewers hat er UTF-8 wieder angenommen und das ä auch als ä dargestellt. Welch peinlicher und vermeidbarer Fehler.

Nachdem ich erst heute mit xml begonnen habe, kenne ich lxml noch nicht. Hab aber schon öfters im Forum davon gelesen. Werde mich dann doch mal damit auseinandersetzen.

Nochmals danke.

Gruß
Markus
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@/me und lunar, da habt ihr schon recht, allerdings ist es sehr "blöd" wenn man XML-Daten von außen bekommt und man sie nicht parsen "kann", weil es nicht 100% korrekt ist (Mit HTML hat man dieses Problem eher)

Blogeintrag nein!, aber ich bin darauf gestoßen als ich versucht hab, die XML-Response von der Google-Wetter API zu "parsen"

Rekonstruieren kann ich es leider nicht mehr
the more they change the more they stay the same
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dav1d hat geschrieben:Blogeintrag nein!, aber ich bin darauf gestoßen als ich versucht hab, die XML-Response von der Google-Wetter API zu "parsen"
Das ist dann aber ganz klar ein Bug in der API und sollte nicht passieren. Damit wird die API nämlich komplett unnütz, da wohlgeformtes XML wirklich die Basis des Datenaustausches über XML ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten