XML-Parser



  • Hallo Leute !

    ich würde euch gerne ein paar Fragen bezüglich des oben gennanten Themas stellen.

    Erstmal einmal eine kurze Einleitung:
    Im Rahmen eines Schulprojekts wollen ich und mein Partner einen XML-Parser schreiben.
    Als praktischen Einsatz dieser Technik wollen wir eine Art PowerPoint bzw. Word etc. schreiben,
    eine genaue Entscheidung ist noch nicht gefallen. Auf jedenfall geht es hier erstmal um den Parser an sich.

    Wir hatten uns zwei Methoden überlegt:

    1. Linienweises Auslesen der Datei
    Hier hatten wir uns gedacht, dass wir sagen, dass die XML-Datei pro Linie maximal ein Tag beinhaltet und man
    den ausliest. Diese Linie wird in eine String-Variable oder in ein Char-Array geschrieben, nach einem <
    durchsucht, der Typ ausgelesen und die nachfolgenden Eigenschaften in eine Art Liste eingetragen.
    Dargestellt wird natürlich alles hierarchisch, es wird alles so lange als Unterobjekt eingetragen, bis
    der Endtag gefunden wurde.

    2. Zeichenweises Auslesen der Datei
    Hier wollen wir die ganze Datei laden, und dann alles nach den Zeichen (<>) und übertrag dann alles. Der Rest
    bleibt genauso wie bei der Methode 1.

    Die konkrete Frage ist jetzt, welche Methode sich in C++ am besten umsetzen lässt
    und welche am einfachsten wäre und am effektivsten. Und auch die Überführung
    der Datei zu Konkreten Klassen ist uns noch nicht ganz klar.
    Wir müssten dann je nach Vorliegenden Typ eine Klasse erzeuegen, also per switch(type) oder gibt es eine
    elegenatere Methode ?

    Die Nutzung von Bibliotheken ist vorerst nicht geplant. Wir wollen das in der Info-AG möglichst alles
    selber schreiben. Das wichtigste dabei ist, dass wir den Umgang mit OOP lernen und auch ein bisschen
    in die Softwareentwicklung einblicken können

    Als Zielplatform haben wir Windows im Auge.

    Ich danke euch schonmal sehr für evtl. Antworten !

    MfG ixp



  • Hi!

    ixp schrieb:

    Hallo Leute !
    1. Linienweises Auslesen der Datei
    Hier hatten wir uns gedacht, dass wir sagen, dass die XML-Datei pro Linie maximal ein Tag beinhaltet und man
    den ausliest. Diese Linie wird in eine String-Variable oder in ein Char-Array geschrieben, nach einem <
    durchsucht, der Typ ausgelesen und die nachfolgenden Eigenschaften in eine Art Liste eingetragen.
    Dargestellt wird natürlich alles hierarchisch, es wird alles so lange als Unterobjekt eingetragen, bis
    der Endtag gefunden wurde.

    Naja... XML wurde von der W3C standardisiert(siehe [1]). Also wenn ihr wirklich einen XML-Parser schreiben wollt, der sich auch an den Standard hält, dann sind pro Zeile mehr als ein Tag erlaubt. Genau genommen, kann man auch das ganze XML-Dokoument in eine Zeile schreiben. Beim streamen von XML-Dokumenten (über Netzwerk beispielsweise) werden auch keine CR/LF übertragen.

    mfg bernd

    [1]: http://www.w3.org/TR/2008/REC-xml-20081126/



  • Um ehrlich zu sein, geht es in erster Linie nicht um die Standardkomformität des Parsers, sonderm um das Erlernen solcher Techniken und deren Möglichkeiten etc. (Steht im Startpost)



  • Hi!

    ixp schrieb:

    Um ehrlich zu sein, geht es in erster Linie nicht um die Standardkomformität des Parsers, sonderm um das Erlernen solcher Techniken und deren Möglichkeiten etc. (Steht im Startpost)

    Muss dir leider widersprechen. Wenn du Software (beruflich oder privat) schreibst, dann musst du dich meistens an Vorgaben und Standards halten.

    Ausserdem, wenn du dich an den Standard hältst, dann hast du Vergleichsmöglichkeiten zu anderen Parsern. Und dabei lernst du noch eine Menge.

    Ausserdem... Was hindert dich daran dich an den Standard zu halten? 🙂
    Du kannst ja mal klein anfangen. Du musst ja nicht gleich jedes Feature, was XML untersützt, implementieren.
    Version 1.0 kann das und das und das.
    Version 2.0 kann mehr... 😉

    mfg bernd


  • Mod

    ixp schrieb:

    Um ehrlich zu sein, geht es in erster Linie nicht um die Standardkomformität des Parsers, sonderm um das Erlernen solcher Techniken und deren Möglichkeiten etc. (Steht im Startpost)

    Aber zumindest wäre nun festgestellt, dass zeilenweises Auslesen hier nicht die richtige Technik ist. Oder wenn schon, dann mit '>' als Trennzeichen (Trennzeichen kann man bei getline angeben). Ich würde es wahrscheinlich aber trotzdem alles zeichenweise in einen String einlesen, diesen dann in Substrings unterteilen nach Tags der obersten Ebene und mich dann rekursiv durcharbeiten.
    Ich habe aber noch nie selber einen XML-Parser selbst geschrieben, aber das wäre meine erste Idee zu dem Format.



  • Okay okay 🙂

    Wollte nur ausdrücken, dass uns fürs erste die Einhaltung von Standards nicht das Wichtigste bei diesem Projekt ist.
    Vorrangig war das Erreichen des Ziels wichtig ^^

    ABer danke erstmal für die Tipps.
    Die bevorzugte Methode soll also das zeilenweise Einlesen sein, damit man den Standard einhalten kann ?

    Einlesen ( in String ) -> Aufteilen (Rekursiv)

    So kann man das definieren, den Prozess ?
    Weiterhin würde ich noch gern fragen, wie man die Überführung der bloßen Stringobjekte zu konkreten Objekten des jeweiligen Typs verwirklichen kann ?

    Hier ist die Effiziens fürs Erste zwietrangig, das kann man später optimieren. Nur die Methode wäre wichtig.

    Könnte man das über folgende Methode realisieren und wäre das praktikabel?:
    Stringobjekt(liegt vor) - Klasse zum Untersuchen --> Erzeugt dann die Objekte und trägt sie in eine Liste ein ?

    Und diese Objekte (Text/Rechtecke/Texte) erben dann von einem Basisobjekt, das eine Liste mit dem Namen Property enthält. Und anhand dieser Liste kann dann eine Klasse diese Objekte im Programm visualisieren.
    Könnte man das machen oder ginge hier eine anderen Art und Weise?


  • Administrator

    ixp schrieb:

    Die bevorzugte Methode soll also das zeilenweise Einlesen sein, damit man den Standard einhalten kann ?

    Nein. Denn wenn wir streng nach Standard gehen, dann gäbe es nämlich so Dinge wie Pretty XML gar nicht. Ein Zeilemumbruch oder Zeileneinzüge gehören nämlich mit zu den Daten von XML. Weshalb ich sowieso XML irgendwie widersprüchlich in sich finde, aber naja, das ist ein anderes Thema.

    Ich würde mich übrigens einem Parser immer über EBNF nähern. Aus dem EBNF kann man grundsätzlich bereits die Programmstruktur für den Parser herauslesen. Für XML 1.0 findet man hier eine zusammengefasste EBNF:
    http://www.jelks.nu/XML/xmlebnf.html

    ixp schrieb:

    Weiterhin würde ich noch gern fragen, wie man die Überführung der bloßen Stringobjekte zu konkreten Objekten des jeweiligen Typs verwirklichen kann ?

    In dem man die Stringobjekte gegen andere Stringobjekte vergleicht und dann daraus Schlussfolgerungen zieht.

    ixp schrieb:

    Könnte man das über folgende Methode realisieren und wäre das praktikabel?:
    Stringobjekt(liegt vor) - Klasse zum Untersuchen --> Erzeugt dann die Objekte und trägt sie in eine Liste ein ?

    Und diese Objekte (Text/Rechtecke/Texte) erben dann von einem Basisobjekt, das eine Liste mit dem Namen Property enthält. Und anhand dieser Liste kann dann eine Klasse diese Objekte im Programm visualisieren.

    Ich würde darauf achten, Code für die (De-)Serialisierung nicht zu stark mit den eigentlichen Objekten zu vermischen. Also lieber einen Reader/Parser zur Verfügung stellen, welcher die benötigten Objekte zum Beispiel über eine Factory erzeugt und zurückgibt. So ganz grob 🙂

    Grüssli


Log in to reply