Lesen und Schreiben von kvtml Vokabeldateien

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.
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

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&#228;ndisch</name>
Bei 'Niederl\xc3\xa4ndisch': (u'Niederl\xe4ndisch'.encode('utf-8'))
<name>Niederl&#195;&#164;ndisch</name>
BlackJack

@Ubuntuxer: Und wo liegt jetzt das Problem? ``<name>Niederl&#228;ndisch</name>`` ist gültiges XML das genau das gewünschte darstellt.
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

BlackJack hat geschrieben:@Ubuntuxer: Und wo liegt jetzt das Problem? ``<name>Niederl&#228;ndisch</name>`` ist gültiges XML das genau das gewünschte darstellt.
Ich habe gerade gemerkt, dass das tatsächlich ohne Probleme funktioniert.
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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ubuntuxer hat geschrieben: Hat einer noch eine Idee wie ich das Problem mit den ersten beiden Zeilen lösen kann?
Hast Du meinen Post überlesen?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Hyperion hat geschrieben:
Ubuntuxer hat geschrieben: Hat einer noch eine Idee wie ich das Problem mit den ersten beiden Zeilen lösen kann?
Hast Du meinen Post überlesen?
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.

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">'
AttributeError: attribute 'doctype' of 'lxml.etree.DocInfo' objects is not writable
Benutzeravatar
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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Ich habs endlich geschafft. :D :D :D
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")
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. :wink:
http://www.python-forum.de/pastebin.php ... &mode=view
Benutzeravatar
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:

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
Diese "if"-Kaskaden sind doch redundant! So geht 's doch einfacher.

Code: Alles auswählen

    entries = tree.find('information')
    for element in entries:
        properties[element.tag] = element.text
Das taucht so in der Art mehrfach auf.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Hyperion hat geschrieben:Es wird nicht so klar, was Dein Modul überhaupt können soll...
Das ganze soll am Ende in einem Vokabeltrainer enden, der das Format kvtml beherscht. :wink:

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
BlackJack

@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.
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

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.
Meinst du in etwa so oder verstehe ich dich da komplett falsch?

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):
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.
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.
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
BlackJack

@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.
Antworten