Textdatei einlesen und in XML ausgeben

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
flyingeagle
User
Beiträge: 22
Registriert: Freitag 21. Juli 2006, 12:12

Hi,

ich habe eine Textdatei die unter Linux erstellt wurde. Diese Textdatei moechte ich nun einlesen und dann in ein XML Dokument ausgeben.

Bislang sieht das ganze so aus:

Code: Alles auswählen

...
oXMLGen.startElement("dateiinhalt", {})
oFile = file(oTxtFileName, 'r')
oXMLGen.characters(str(oFile.readlines()))
oXMLGen.endElement("dateiinhalt")
...
Wenn ich das gemacht habe bekomme ich auch ein XML File mit den entsprechenden Daten aus der Textdatei.
Lieder ist das XML File nachher nicht mehr Valide, folgende Fehlermeldung erhalte ich nach einem sax2print auf die entstandene Datei:

Code: Alles auswählen

Fatal Error at file C:\output.xml, line 1, char 1
  Message: Invalid document structure
Wie bekomme ich es nun hin dass die Daten aus der Textdatei valide in mein XML gelangen?

PS: in meinem Ergebnis sind auch Zeichen wie diese hier \x0 => UTF8, mein XML ist aber ein ISO. Vielleicht liegt es auch daran? Wie wuerde ich das UTF8 Zeugs denn in ein ISO-Format bringen?

Gruss Martin
BlackJack

Zu wenig Information. Wie erzeugst Du das XML? In welcher Kodierung liegt die Textdatei vor? Wenn da wirklich '\0'-Bytes drin sind, dann bekommst Du das so gar nicht in XML, sondern müsstest die Daten irgendwie kodieren. Quoted-Printable oder Base64 böten sich an.

Grundsätzlich würde ich das erzeugen von XML einer Bibliothek überlassen, die sich um alles kümmert. Also Escapen von Zeichen mit besonderer Bedeutung, Kodierung und so weiter. Und ich würde Konsequent mit Unicode arbeiten. `ElementTree` ist angenehm zu benutzen und ab Python 2.5 sogar in der Standardbibliothek enthalten.
flyingeagle
User
Beiträge: 22
Registriert: Freitag 21. Juli 2006, 12:12

Hi,

ich arbeite mit dem XMLGenerator aus xml.sax.saxutils

Code: Alles auswählen

#!/usr/bin/python

from xml.sax.saxutils import XMLGenerator 

if __name__ == '__main__':
  oOutStream = sys.stdout
   
  oXMLGen = XMLGenerator(oOutStream,"iso-8859-1")
  oXMLGen.startDocument()
  oXMLGen.startElement("dateiinhalt", {})
  oFile = file("C:/test.txt", 'r')
  oXMLGen.characters(str(oFile.readlines()))
  oXMLGen.endElement("dateiinhalt")
  oXMLGen.endDocument()
Die Textdatei ist in UTF-8 codiert.

Die Codierung in Quoted Printable waehre mir nicht so lieb. Ich habe irgendwie das Gefuehl dass mir das file und dessen readlines die Daten irgendwie so umbauen dass sie nicht mehr ordentlich sind.

Text in der Textdatei:

Code: Alles auswählen

Gruppenhomogenität zurückzuführen
Text in der von mir erstellten XML

Code: Alles auswählen

Gruppenhomogenit\xc3\xa4t zur\xc3\xbcckzuf\xc3\xbchren
Ich haette nun gerne dass im XML auch die Umlaute etc. funktionieren, reicht hier vielleicht schon ein anderes einlesen der Datei?

Gruss Martin
BlackJack

Das erste Problem ist, dass Du den Dateiinhalt mit `readlines()` in eine Liste einliest und die dann in eine Zeichenkette umwandelst. Damit bekommst Du die Liste als Zeichenkette dargestellt. Das ist bestimmt nicht dass was Du wolltest, Du wolltest den Inhalt der Textdatei haben.

Wie gesagt, würde ich mit Unicode arbeiten. Die Textdatei mit `codecs.open()` und der Angabe der entsprechenden Kodierung öffnen und mit `read()` komplett einlesen. Dann die Datei wieder schliessen!

Was sollen denn die ganzen kleinen 'o's? Falls das anzeigen soll, dass es sich um ein 'O'bjekt handelt, dann ist das höchstgradig überflüssig, weil in Python *alles* ein Objekt ist. Das weiss man auch ohne das 'o'. Und in einer Sprache mit "duck typing" Typpräfixe den Namen voranzustellen ist bisweilen recht falsch und verwirrend. Es reicht dann nicht, wenn man später mal einen Typ durch einen anderen, kompatiblen ersetzt, nur den Typ zu ändern, sondern man müsste dann auch noch alle Namen ändern, damit darüber keine falsche Information vermittelt wird.
flyingeagle
User
Beiträge: 22
Registriert: Freitag 21. Juli 2006, 12:12

Hi,

dass mit dem readlines ist mir auch gerade aufgefallen.

Ja das o soll ein Objekt darstellen, auch wenn es ueberfluessig erscheint muss ich es laut Programmierrichtlinien machen.

Schreibe nun die einzelnen Zeilen in das XML, klappt soweit auch ganz gut, habe die Textdateien nun in Latin1 codiert.

Die Umlaute etc. werden nun korrekt dargestelllt.
Ich muss nun nur noch in jeder Zeile alle Zeichen (mit einem ASCII-Wert kleiner 32) durch ein Leerzeichen ersetzen.

Wie gehe ich da am besten vor bzw. wie ersetze ich diese Zeichen am einfachsten?

Gruss Martin
BlackJack

Schau dir mal die `translate()`-Methode auf (Unicode)Zeichenketten an.

Und verhau' den für die Richtlinien Verantwortlichen mal ordentlich. ;-)
Antworten