Uups, entschuldige ich hab da irgendetwas durcheinandergebracht.
Also es sieht bei mir so aus:
Orginal:
<name>Niederländisch</name>
Bei u'Niederl\xe4ndisch':
<name>Niederländisch</name>
Bei 'Niederl\xc3\xa4ndisch': (u'Niederl\xe4ndisch'.encode('utf-8'))
<name>Niederländisch</name>
Lesen und Schreiben von kvtml Vokabeldateien
@Ubuntuxer: Und wo liegt jetzt das Problem? ``<name>Niederländisch</name>`` ist gültiges XML das genau das gewünschte darstellt.
Ich habe gerade gemerkt, dass das tatsächlich ohne Probleme funktioniert.BlackJack hat geschrieben:@Ubuntuxer: Und wo liegt jetzt das Problem? ``<name>Niederländisch</name>`` ist gültiges XML das genau das gewünschte darstellt.
Parley konnte meine erstellte Datei aus einem anderen Grund nicht lesen. Anscheinend werden die Dateien von Parley irgendwie gecacht, sodass wenn ich die erstellte Datei ohne die beiden ersten Zeilen öffne und danach die Zeilen einfüge und noch einmal die Datei mit Parley öffne nur eine Sprache angezeigt wird. Ich dachte die ganze Zeit dies läge an den Unicodes, da die deutschen Wörter in Parley nicht angezeigt wurden.
Damit hat sich das Unicode Problem erledigt. Danke für deine Geduld Blackjack.
Hat einer noch eine Idee wie ich das Problem mit den ersten beiden Zeilen lösen kann?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Hast Du meinen Post überlesen?Ubuntuxer hat geschrieben: Hat einer noch eine Idee wie ich das Problem mit den ersten beiden Zeilen lösen kann?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Ich möchte den Doctype nicht auslesen, sondern in eine neue kvtml Datei reinschreiben. Mit lxml kann man zumindestens den Doctype auslesen, aber ich habe mir auch die lxml Referenz angeschaut und keine Erklärung gefunden wie man den Doctype in eine neue xml schreiben kann.Hyperion hat geschrieben:Hast Du meinen Post überlesen?Ubuntuxer hat geschrieben: Hat einer noch eine Idee wie ich das Problem mit den ersten beiden Zeilen lösen kann?
Code: Alles auswählen
from lxml import etree
root = etree.Element("kvtml")
root.set("version", "2.0")
tree = etree.ElementTree(root)
tree.docinfo.doctype = u'<!DOCTYPE kvtml PUBLIC "kvtml2.dtd" "http://edu.kde.org/kvtml/kvtml2.dtd">'
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Stimmt. Die DocInfo properties sind wohl read-only. Vielleicht hilft Dir das weiter:
http://stackoverflow.com/questions/9918 ... xmls-etree
http://stackoverflow.com/questions/9918 ... xmls-etree
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Ich habs endlich geschafft.
Also, ich habe gerade gelesen, dass es nicht möglich ist den Doctype zu schreiben.
http://osdir.com/ml/python.lxml.devel/2 ... 00036.html
@Hyperion: Dein Link hat mir bei dem anderen Problem geholfen, nämlich mit der ersten Zeile.
Man muss einen Parameter an die write Methode übergeben:
Beim testen habe ich dann gemerkt, dass Parley die blöde Doctype Zeile gar nicht braucht.
Es klappt jetzt alles wunderbar.
Danke an alle die mir geholfen haben!!!
Vielleicht habt ihr ja noch ein paar Verbesserungsvorschläge.
http://www.python-forum.de/pastebin.php ... &mode=view
Also, ich habe gerade gelesen, dass es nicht möglich ist den Doctype zu schreiben.
http://osdir.com/ml/python.lxml.devel/2 ... 00036.html
@Hyperion: Dein Link hat mir bei dem anderen Problem geholfen, nämlich mit der ersten Zeile.
Man muss einen Parameter an die write Methode übergeben:
Code: Alles auswählen
tree.write(filename, xml_declaration=True, encoding="utf-8")
Es klappt jetzt alles wunderbar.
Danke an alle die mir geholfen haben!!!
Vielleicht habt ihr ja noch ein paar Verbesserungsvorschläge.
http://www.python-forum.de/pastebin.php ... &mode=view
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Es wird nicht so klar, was Dein Modul überhaupt können soll...
Mir ist das hier öfter aufgefallen:
Diese "if"-Kaskaden sind doch redundant! So geht 's doch einfacher.
Das taucht so in der Art mehrfach auf.
Mir ist das hier öfter aufgefallen:
Code: Alles auswählen
entries = tree.find('information')
for element in entries:
if element.tag == 'title':
properties['title'] = element.text
if element.tag == 'comment':
properties['comment'] = element.text
if element.tag == 'date':
properties['date'] = element.text
if element.tag == 'author':
properties['author'] = element.text
if element.tag == 'license':
properties['license'] = element.text
Code: Alles auswählen
entries = tree.find('information')
for element in entries:
properties[element.tag] = element.text
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Das ganze soll am Ende in einem Vokabeltrainer enden, der das Format kvtml beherscht.Hyperion hat geschrieben:Es wird nicht so klar, was Dein Modul überhaupt können soll...
Ich habe die Funktionen nun in Klassen gepackt. Eigentlich finde ich das in diesem Fall Klassen nicht so gut geeignet sind, aber ich wollte keine globalen Variablen haben.
Das Modul kann nun auch geschachtelte Lektionen auslesen und einlesen.
http://www.python-forum.de/pastebin.php?mode=view&s=11
@Ubuntuxer: Klassen wären in diesem Fall sicher gut, aber sicher nicht in dieser Aufteilung. Klassen sollten "Dinge" repräsentieren. Was bitte ist ein "Read" oder ein "Write"? Das sind Tätigkeiten und wären ein Namen für Funktionen.
Es würde mehr Sinn machen die Teile der XML-Datei als eigene Datentypen zu modellieren. Also zum Beispiel eine `Vocabulary`-Klasse mit einer statischen Methode oder einer Klassenmethode `load()` oder `parse()` um ein Exemplar aus XML zu erzeugen und einer `save()`-Methode, die mit Hilfe einer `to_xml()`-Methode auf den einzelnen Bestandteilen wieder ein XML-Dokument daraus macht.
Das kann man sicher auf mehrere sinvolle Unterklassen runterbrechen. Eine für die Informationen, für die einzelnen `identifier`-Elemente, einzelne `entry`-Objekte, Containerklassen für die einzelnen Lektionen und so weiter.
Es würde mehr Sinn machen die Teile der XML-Datei als eigene Datentypen zu modellieren. Also zum Beispiel eine `Vocabulary`-Klasse mit einer statischen Methode oder einer Klassenmethode `load()` oder `parse()` um ein Exemplar aus XML zu erzeugen und einer `save()`-Methode, die mit Hilfe einer `to_xml()`-Methode auf den einzelnen Bestandteilen wieder ein XML-Dokument daraus macht.
Das kann man sicher auf mehrere sinvolle Unterklassen runterbrechen. Eine für die Informationen, für die einzelnen `identifier`-Elemente, einzelne `entry`-Objekte, Containerklassen für die einzelnen Lektionen und so weiter.
Meinst du in etwa so oder verstehe ich dich da komplett falsch?BlackJack hat geschrieben:@Ubuntuxer: Klassen wären in diesem Fall sicher gut, aber sicher nicht in dieser Aufteilung. Klassen sollten "Dinge" repräsentieren. Was bitte ist ein "Read" oder ein "Write"? Das sind Tätigkeiten und wären ein Namen für Funktionen.
Es würde mehr Sinn machen die Teile der XML-Datei als eigene Datentypen zu modellieren. Also zum Beispiel eine `Vocabulary`-Klasse mit einer statischen Methode oder einer Klassenmethode `load()` oder `parse()` um ein Exemplar aus XML zu erzeugen und einer `save()`-Methode, die mit Hilfe einer `to_xml()`-Methode auf den einzelnen Bestandteilen wieder ein XML-Dokument daraus macht.
Code: Alles auswählen
class Vocabulary():
def __init__(self, filename=None):
self.filename = filename
def load(self):
def _get_lesson(self, element):
def _get_word(self, entry):
def save(self, vocabulary, properties):
def _set_container(self, element, lesson):
def _indent(self, elem, level=0):
Ich habe mal versucht ein Klassengerüst zu erstellen, aber ich tue mich damit unglaublich schwer. Die Möglichkeiten, die man mit einer Klasse und Vererbung hat, kann man sich anlesen. Ich finde es aber enorm schwierig die Möglichkeiten sinnvoll einzusetzen. Könnt ihr euch mein Grundgerüst mal anschauen und mir ein paar Tipps geben wie ich das besser aufbauen kann.Das kann man sicher auf mehrere sinvolle Unterklassen runterbrechen. Eine für die Informationen, für die einzelnen `identifier`-Elemente, einzelne `entry`-Objekte, Containerklassen für die einzelnen Lektionen und so weiter.
Bei den geschachtelten Lektionen habe ich noch gar keine Idee, wie man dies mit Klassen realisieren kann.
http://www.python-forum.de/pastebin.php?mode=view&s=13
@Ubuntuxer: Ich würde mich bei den Klassen grob an der XML-Struktur orientieren. Und Vererbung sehe ich da nicht wirklich. Durch Vererbung wird eine "ist-ein(e)"-Beziehung ausgedrückt. Das ist bei Deinen Vererbungen aber nicht der Fall. Eine Vokabel ist keine Beurteilung/Note und eine Lektion ist kein Sprachbezeichner.
Das Laden sollte IMHO nicht mit der `__init__()`-Methode verbunden sein -- man sollte auch solche Datenstrukturen erstellen können ohne auf eine Datei zugreifen zu müssen. Und der Dateiname gehört nicht zwingend zu so einem Objekt. Bei Dateien ist der Dateiname ja auch getrennt vom Inhalt gespeichert.
Das Laden sollte IMHO nicht mit der `__init__()`-Methode verbunden sein -- man sollte auch solche Datenstrukturen erstellen können ohne auf eine Datei zugreifen zu müssen. Und der Dateiname gehört nicht zwingend zu so einem Objekt. Bei Dateien ist der Dateiname ja auch getrennt vom Inhalt gespeichert.