XML / Codierung nicht korrekt?

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
Gast

Hi!
Ich habe ein Problem mit verschiedenen XML-Dateien, die ich parsen will. Zunächst bestand mein Problem darin, dass ich Fehlermeldungen bei Umlauten bekam. Das altbekannte

Code: Alles auswählen

'ascii' codec can't encode character u'\xf6'...
Nachdem ich hier verschiedene Ratschläge gelesen habe, die XML-Datei im Unicode-Format zu speichern, habe ich das auch getan. Ich benutze den Context Texteditor, falls den jemand kennt, da gibt es die Option Tools=>Convert text to => Unicode. Das sollte eigentlich tun, oder?

Nachdem ich das gemacht habe, kann ich jetzt gar nicht mehr parsen. Meine XML-Datei fängt so an:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
Das Ergebnis ist folgendes:
Reines validieren der Datei gegen die DTD gibt:

Code: Alles auswählen

encoding 'iso-8859-1' conflicts with autodetected encoding
Der Versuch zu parsen ergibt dann:

Code: Alles auswählen

SAXParseException: encoding specified in XML declaration is incorrect
Mein Code zum parsen sieht dabei so aus:

Code: Alles auswählen

from xml.sax import make_parser
ch=eigener_Handler()
parser=make_parser()
parser.setContentHandler(ch)
parser.parse(datei)
Wo liegt jetzt der Fehler, dass er mit der Codierung meckert? Und wie kriege ich den Parser dazu, Umlaute zu fressen?

Danke schon mal für Vorschläge!
Gruß,
Michael
Michael Euteneuer
User
Beiträge: 9
Registriert: Mittwoch 7. Januar 2004, 16:36

Wollte nur hinzufügen, dass ich kein Gast bin, sondern angemeldet. Hab mir nur zuviel Zeit gelassen mit dem schreiben, wie es aussieht, und bin dabei ausgelogt worden...

Grüße,
Michael
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Michael,

die Meldung "encoding 'iso-8859-1' conflicts with autodetected encoding" sagt ja schon alles.
Ändere

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
in

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8" standalone="no"?>
dann klappts.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Michael Euteneuer
User
Beiträge: 9
Registriert: Mittwoch 7. Januar 2004, 16:36

Danke für die schnelle Antwort, aber leider gibt das dann folgende Meldung:

Code: Alles auswählen

encoding 'utf-8' conflicts with autodetected encoding
Folgendes hab ich noch probiert:

Code: Alles auswählen

>>> import sys
>>> sys.getfilesystemencoding()
'mbcs'
Sagt das was über mein Problem aus?

Gruß,
Michael
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

hmm mal wieder Windowsspezialitäten, wie es scheint schreibt dein Editor im mbcs-codec, da muss ich dich auf die unicode faq u.s.w. verweisen.
http://p-nand-q.com/python/unicode_faq.html
http://p-nand-q.com/python/umlaute_in_xml.html
http://python.active-venture.com/lib/node127.html

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Michael Euteneuer
User
Beiträge: 9
Registriert: Mittwoch 7. Januar 2004, 16:36

Meine Python-Skripte schreibe ich allerdings nicht im Texteditor, sondern in der Python-Shell (bzw. in von dort aus geöffneten Fenstern) von Python 2.3, die als IDLE mitgeliefert wird.

Das sys.getfilesystemencoding() hatte ich auch dort ausgeführt, das dürfte also nix mit den XML-Dateien zu tun haben, oder?

Gruß,
Michael
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Sagen wir mal sollte nichts damit zu tun haben.
Was kommt für eine Ausgabe, wenn du folgendes in der Pythonshell versuchst:

Code: Alles auswählen

>>> print repr(open("my.xml". 'r').read(8))
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Dookie hat geschrieben: Was kommt für eine Ausgabe, wenn du folgendes in der Pythonshell versuchst:

Code: Alles auswählen

>>> print repr(open("my.xml". 'r').read(8))
Das gibt folgendes:

Code: Alles auswählen

>>> print repr(open(r"C:\Dokumente und Einstellungen\Michael\...longpath...\datei.xml", 'r').read(8))
'\xff\xfe<\x00?\x00x\x00'
Das wiederum sieht für mich wie Unicode aus, allerdings erzeugt print etwas seltsames... Kann es hier nicht darstellen, copy&paste nimmt das nicht mit... Fängt mit ÿþ< an, dann kommen die ersten Zeichen des XML-Files, jeweils durch ein Quadrat getrennt.... Das geht auch bei längeren Stücken so weiter.

Hilft das weiter?

Gruß und Dank,
Michael
Michael Euteneuer
User
Beiträge: 9
Registriert: Mittwoch 7. Januar 2004, 16:36

P.S.: Und warum zur Hölle loggt es mich immer aus? :evil:

Michael
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Das mit dem Ausloggen könnte ein Problem mit den Cookies sein, lösch die mal und logge dich neu ein.

Code: Alles auswählen

'\xff\xfe<\x00?\x00x\x00'
hilft weiter :)
ist Unicode, allerdings utf-32 (little-endian) und kein utf-8. Schau mal ob du bei deinem Editor für xml utf-8 einstellen kannst.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Michael Euteneuer
User
Beiträge: 9
Registriert: Mittwoch 7. Januar 2004, 16:36

Dookie hat geschrieben:Schau mal ob du bei deinem Editor für xml utf-8 einstellen kannst.
Nein, kann ich nicht. Ich habe aber mal einen anderen Texteditor versucht (SciTE), da kann ich explizit UTF-8 als Encoding angeben. Dann meckert er auch nicht mehr beim Start, dass sich encodings widersprechen. Allerdings bekomme ich dann das Problem, das er trotz

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8" standalone="no"?>
folgendes meldet, sobald ein Umlaut auftaucht:

Code: Alles auswählen

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 3: ordinal not in range(128)
Wieso versucht der da was mit ascii?

Gruß,
Michael
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

könntest Du mal die Funktion eigener_Handler posten und die genaue Fehlermeldung mit der Zeilennummer?
Vermutlich wird versucht den Unicode in einen Bytestring umzuwandeln und dann auszugeben oder zu speichern.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Michael Euteneuer
User
Beiträge: 9
Registriert: Mittwoch 7. Januar 2004, 16:36

Hi!
Es Läuft!!! :D

Die Kombination zweier Deiner Tipps hat geholfen:
1. Der Editor. Ich hab die Sachen jetzt in UTF-8 Codiert.
2. Deine Links. Bei einem dieser Links habe ich was gelesen und angewendet. Statt

Code: Alles auswählen

str(characters) 
in der Funktion characters meines ContentHandler heisst es jetzt

Code: Alles auswählen

str(characters.encode("cp1252")) 
Und alles funktioniert einwandfrei!

Vielen Dank für die Mühe und einen schönen Abend!

Viele Grüße,
Michael
Antworten