Seite 1 von 2
encoding in XML-File und MiniDOm
Verfasst: Mittwoch 16. November 2005, 10:55
von 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:
Geliefert wird aber nur :
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.
Re: encoding in XML-File und MiniDOm
Verfasst: Mittwoch 16. November 2005, 12:19
von gerold
polarsonnenschein2 hat geschrieben: Dieser Output wird benötigt:
<?xml version="1.0" encoding="utf-8"?>
Hi Volker!
Das dürfte dir helfen:
mfg
Gerold

wie einbinden ?
Verfasst: Mittwoch 16. November 2005, 14:27
von polarsonnenschein
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.
Re: wie einbinden ?
Verfasst: Mittwoch 16. November 2005, 14:37
von Leonidas
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()
Re: wie einbinden ?
Verfasst: Mittwoch 16. November 2005, 15:06
von mitsuhiko
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

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/
Doch nicht so einfach...
Verfasst: Mittwoch 16. November 2005, 15:10
von polarsonnenschein
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.
Re: Doch nicht so einfach...
Verfasst: Mittwoch 16. November 2005, 15:16
von mitsuhiko
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?
Daten
Verfasst: Mittwoch 16. November 2005, 15:30
von polarsonnenschein
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.
Re: Daten
Verfasst: Mittwoch 16. November 2005, 15:46
von mitsuhiko
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.
Erst den Header
Verfasst: Mittwoch 16. November 2005, 16:08
von polarsonnenschein
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
encoding ... nochmal ...
Verfasst: Mittwoch 16. November 2005, 16:11
von polarsonnenschein
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
Betriebssystem
Verfasst: Mittwoch 16. November 2005, 16:14
von polarsonnenschein
Bevor ichs vergesse. Ich arbeite unter LINUX. SLES
Verfasst: Mittwoch 16. November 2005, 16:47
von mitsuhiko
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

Re: Doch nicht so einfach...
Verfasst: Mittwoch 16. November 2005, 17:03
von gerold
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

Erst mal das encoding...
Verfasst: Mittwoch 16. November 2005, 17:17
von polarsonnenschein
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.
Re: Doch nicht so einfach...
Verfasst: Mittwoch 16. November 2005, 17:58
von mitsuhiko
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'

Re: Doch nicht so einfach...
Verfasst: Donnerstag 17. November 2005, 01:59
von 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'
Re: Doch nicht so einfach...
Verfasst: Donnerstag 17. November 2005, 09:44
von gerold
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.

--> denke doch noch zu sehr in "Visual Basic".
lg
Gerold

Verfasst: Donnerstag 17. November 2005, 15:49
von Leonidas
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.
Verfasst: Donnerstag 17. November 2005, 22:30
von 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.
Wenn jetzt jeder Aufruf noch zwei bis fünf Argumente mit auf den Weg bekommt, dann macht das schon Sinn.