encoding in XML-File und MiniDOm

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.
polarsonnenschein2

Hallo,

ich will mittels minidom eine XML-Datei erzeugen, was auch bestens gelingt.
Allerdings sehe ich keinen Weg, wie man in die Kopfzeile des XML-Files
das Encoding einbinden kann.

Dieser Output wird benötigt:

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8"?>

Geliefert wird aber nur :

Code: Alles auswählen

<?xml version="1.0"?>

Ist dieses mit minidom überhaupt möglich ? Wenn ja wie ?
(unter Beibehaltung der vorliegenden Codierung)

Code: Alles auswählen

# Anfang Codeblock

import xml.dom.minidom
S_FILE_NAME = "TEST"
S_FILE_TEST = S_FILE_NAME

TEST = xml.dom.minidom.Document()

# Node <test01>
test01 = TEST.createElementNS("","test01") ; TEST.appendChild(test01)


TEST_xml = file(S_FILE_TEST, "w")
TEST_xml.writelines(TEST.toprettyxml(" "))

TEST_xml.close()

# Ende Codeblock

Über evtl. alternative Methoden, wozu es auch eine "freundliche" Doku gibt wären natürlich auch nicht schlecht. Allerdings lizenzfrei.

Danke,

Volker

Edit (Leonidas): Code in Python-Tags gesetzt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

polarsonnenschein2 hat geschrieben: Dieser Output wird benötigt:
<?xml version="1.0" encoding="utf-8"?>
Hi Volker!

Das dürfte dir helfen:

Code: Alles auswählen

toprettyxml(indent='  ', encoding="utf-8")
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
polarsonnenschein
User
Beiträge: 18
Registriert: Mittwoch 16. November 2005, 10:29

Hallo,

erst mal Danke für das Posting. Leider ist mir nicht klar wo ich den
"Codeschnipsel" einfügen muss um das gewünschte Ergebnis zu
erhalten ...

Nächstes Problem wird auch sein die auszugebenden Daten (Oracle)
in UTF-8 zu transformieren.

Wirklich frustrierend, daß es zu diesem Themenbereich keine
Docs und "Demos" gibt. Scheint ja wohl permanent diese Fragestellungen
zu geben.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

polarsonnenschein hat geschrieben:erst mal Danke für das Posting. Leider ist mir nicht klar wo ich den
"Codeschnipsel" einfügen muss um das gewünschte Ergebnis zu
erhalten ...
Also das ist wirklich nun nicht mehr schwer:

Code: Alles auswählen

import xml.dom.minidom
S_FILE_NAME = "TEST"
S_FILE_TEST = S_FILE_NAME

test = xml.dom.minidom.Document()

test01 = test.createElementNS("","test01") ; TEST.appendChild(test01)


test_xml = file(S_FILE_TEST, "w")
test_xml.writelines(TEST. toprettyxml(indent='  ', encoding="utf-8"))

test_xml.close()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

polarsonnenschein hat geschrieben:Wirklich frustrierend, daß es zu diesem Themenbereich keine
Docs und "Demos" gibt. Scheint ja wohl permanent diese Fragestellungen
zu geben.
Oh Wunder :roll: Das ist ja auch nur eine 1:1 Implementation der DOM1.0 Spezifikation. Evtl mal beim w3c vorbeischauen: http://www.w3.org/TR/REC-DOM-Level-1/
TUFKAB – the user formerly known as blackbird
polarsonnenschein
User
Beiträge: 18
Registriert: Mittwoch 16. November 2005, 10:29

Hallo,

so einfach ist's dann doch nicht ... leider wird diese Fehlermeldung ausgespuckt...

Code: Alles auswählen

Traceback (most recent call last):
   File "test41.sbl", line 11, in ?
     test_xml.writelines(test. toprettyxml(indent='  ', encoding="utf-8"))
   File "/cc3.45/E027/cx/sbl/py/xml/dom/minidom.py", line 56, in toprettyxml
     writer = codecs.lookup(encoding)Ä3Ü(writer)
 LookupError: no codec search functions registered: can't find encoding
 Error in evalueating test41.sbl
Edit (Leonidas): Fehlermeldung in Code-Tags gesetzt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

polarsonnenschein hat geschrieben:Hallo,

so einfach ist's dann doch nicht ... leider wird diese Fehlermeldung ausgespuckt...

Code: Alles auswählen

In [1]: from xml.dom import minidom

In [2]: doc = minidom.Document()

In [3]: data = doc.createElement('data')

In [4]: text = doc.createTextNode('this is some content')

In [5]: data.appendChild(text)
Out[5]: <DOM Text node "this is so...">

In [6]: doc.appendChild(data)
Out[6]: <DOM Element: data at -0x487bc7b4>

In [7]: doc.toprettyxml(indent='  ', encoding='utf-8')
Out[7]: '<?xml version="1.0" encoding="utf-8"?>\n<data>\n  this is some content\n</data>\n'
scheint zu funktionieren :-)

haben deine string mit denen du das dom obj fütterst auch utf-8 oder etwas, dass das codecs modul in utf-8 umwandeln kann?
TUFKAB – the user formerly known as blackbird
polarsonnenschein
User
Beiträge: 18
Registriert: Mittwoch 16. November 2005, 10:29

Hallo,

die Daten kommen direkt aus Oracle herausgepurzelt. Also ISO 8859-1.
Doch so weit bin ich ja noch nicht.

Ich kämpfe momentan noch mit dem Header, der sich nicht einfügen läßt.
Aufgezeigter Fehler tritt auf.

Zum Nachvollziehen wäre es sinnvoll den selben "Testfall" zu nutzen.

Thx.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

polarsonnenschein hat geschrieben:die Daten kommen direkt aus Oracle herausgepurzelt. Also ISO 8859-1.
Doch so weit bin ich ja noch nicht.
Warum willst du dann utf-8 als encoding haben? wenn die daten iso8859-1 sind?

probier mal text.decode("iso-8859-1").encode("utf-8") für deine ausgabe, wenn du es utf-8 haben willst.
TUFKAB – the user formerly known as blackbird
polarsonnenschein
User
Beiträge: 18
Registriert: Mittwoch 16. November 2005, 10:29

Hallo,

Schritt für Schritt. Wie war das im ersten Semester ? Divide and
Conquer ...

Zuerst soll der Header das encoding erst mal annehmen. Das funktioniert in der beschriebenen Weise nicht. Müssen noch Lib's eingebunden
werden ?

Danke
polarsonnenschein
User
Beiträge: 18
Registriert: Mittwoch 16. November 2005, 10:29

P.S. selbst wenn ich das Encoding auf ISO-8859-1 stelle erhalte ich den Fehler. Notfalls könnte ich die XML-Datei mit korrekem Encoding
durch einen Konverter jagen (Mercator or what ever)

Fehler:
LookupError: no codec search functions registered: can't find encoding
Error in evalueating test41.sbl
polarsonnenschein
User
Beiträge: 18
Registriert: Mittwoch 16. November 2005, 10:29

Bevor ichs vergesse. Ich arbeite unter LINUX. SLES
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

er hat irgendwo ein problem mit dem Konvertieren der Daten zu utf-8.
Evtl postet du mal den Code, den exakten Namen des Datenbank encodings und dann tappen wir nicht mehr im Dunkeln :)
TUFKAB – the user formerly known as blackbird
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

polarsonnenschein hat geschrieben:

Code: Alles auswählen

Traceback (most recent call last):
   File "test41.sbl", line 11, in ?
     test_xml.writelines(test. toprettyxml(indent='  ', encoding="utf-8"))
   File "/cc3.45/E027/cx/sbl/py/xml/dom/minidom.py", line 56, in toprettyxml
     writer = codecs.lookup(encoding)Ä3Ü(writer)
 LookupError: no codec search functions registered: can't find encoding
 Error in evalueating test41.sbl
Hi!

Nach dieser irreführenden Fehlermeldung zu schließen, ist ein Leerzeichen zwischen "test." und "toprettyxml" zu viel.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
polarsonnenschein
User
Beiträge: 18
Registriert: Mittwoch 16. November 2005, 10:29

Nach Recherche auf diversen Pages bin ich dahinter gekommen, warum
die Fehlermeldung auftritt.

Im Source-Verzeichnis von Python fehlte das Unterverzeichnis
encodings.

Nach Analyse der Source codecs.py bin ich auf "import encodings"
gestoßen und hab mein abgespecktes python daraufhin geprüft.

Nun erscheint auch das encoding.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

gerold hat geschrieben:Nach dieser irreführenden Fehlermeldung zu schließen, ist ein Leerzeichen zwischen "test." und "toprettyxml" zu viel.

Code: Alles auswählen

In [1]: "spam" .decode("utf-8")
Out[1]: u'spam'

In [2]: "eggs".decode("utf-8")
Out[2]: u'eggs'
8)
TUFKAB – the user formerly known as blackbird
BlackJack

gerold hat geschrieben:
polarsonnenschein hat geschrieben:

Code: Alles auswählen

Traceback (most recent call last):
   File "test41.sbl", line 11, in ?
     test_xml.writelines(test. toprettyxml(indent='  ', encoding="utf-8"))
   File "/cc3.45/E027/cx/sbl/py/xml/dom/minidom.py", line 56, in toprettyxml
     writer = codecs.lookup(encoding)Ä3Ü(writer)
 LookupError: no codec search functions registered: can't find encoding
 Error in evalueating test41.sbl
Nach dieser irreführenden Fehlermeldung zu schließen, ist ein Leerzeichen zwischen "test." und "toprettyxml" zu viel.
Das dürfte kaum den Fehler provozieren. Der Punkt-Operator ist genau das: ein Operator. Wie '+' oder '-' oder '*' auch, es ist egal wieviele Leerzeichen oder sogar Zeilenumbrüche davor und dahinter stehen.

Code: Alles auswählen

In [1]: a = 'hallo'

In [2]: a.upper()
Out[2]: 'HALLO'

In [3]: (a
   .3.:            .
   .3.:  upper
   .3.:  (
   .3.:           )
   .3.: )
Out[3]: 'HALLO'
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

blackbird hat geschrieben:

Code: Alles auswählen

In [1]: "spam" .decode("utf-8")
Out[1]: u'spam'

In [2]: "eggs".decode("utf-8")
Out[2]: u'eggs'
Ups, das wusste ich noch nicht. :oops: :oops: --> denke doch noch zu sehr in "Visual Basic".

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Aber da sollte man, obwohl es möglich ist, keine Leerzeichen reinmachen. Ich habe zum Glück auch noch keinen Quelltext gesehen, der sowas machen würde.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ich habe das schon gesehen und auch schon gemacht. Es ist eine relativ "natürliche" Bruchstelle wenn man Methodenaufrufe auf Ergebnisse von vorhergehenden Aufrufen aneinanderkettet und das auf mehrere Zeilen verteilen möchte.

Code: Alles auswählen

(spam.frobnicate()
    .fooble()
    .stringify()
    .flobs())
Wenn jetzt jeder Aufruf noch zwei bis fünf Argumente mit auf den Weg bekommt, dann macht das schon Sinn.
Antworten