XML auslesen mit C++



  • Hallo Leute,

    ich möchte eine kleine XML Datei mit C++ einlesen:

    <?xml version="1.0"?>
    <version>1.0</version>
    <image>testimage.jpg</image>
    <topology>
    	<coords>
    		<utm id="1">
    			<h>10.123</h>
    			<v>20.456</v>
    			<d>30.789</d>
    			<format>0</format>
    		</utm>
    		<utm id="2">
    			<h>40.123</h>
    			<v>50.456</v>
    			<d>60.789</d>
    			<format>0</format>
    		</utm>
    	</coords>
    	<edges>
    		<edge id="1">
    			<startknotid>1</startknotid>
    			<endknotid>2</endknotid>
    		</edge>
    		<edge id="2">
    			<startknotid>2</startknotid>
    			<endknotid>3</endknotid>
    		</edge>
    	</edges>
    </topology>
    

    Nachdem ich mich ein wenig umgeschaut habe, fand ich libxml des gnome projektes.

    Leider gibt es dazu nur sehr umfangreiche Beispiele die einen fast schon erschlagen.

    Könnte mir jemand sagen wie ich mit libxml den string aus <image>:testimage.jpg
    oder die ids herausbekomme?

    Wäre dankbar wenn man mir die Methode nennen könnte.



  • rapidxml ist sehr schön und vor allem schnell, bietet den Vorteil dass es Header Only ist, also nix extra kompilieren und linken. pugixml bietet ein paar Features mehr.
    tinyxml ist wohl aus historischen Gründen recht beliebt, hat aber performancetechnisch den Anschluss verpasst und ist auch sonst nicht so schön 🙂

    Also, wenn du dich nicht schon auf libxml eingeschossen hast (wovon ich nicht wirklich Peil hab) kannst du ja eine der Obigen Alternativen anschauen.



  • l'abra d'or schrieb:

    rapidxml ist sehr schön und vor allem schnell, bietet den Vorteil dass es Header Only ist, also nix extra kompilieren und linken. pugixml bietet ein paar Features mehr.
    tinyxml ist wohl aus historischen Gründen recht beliebt, hat aber performancetechnisch den Anschluss verpasst und ist auch sonst nicht so schön 🙂

    Also, wenn du dich nicht schon auf libxml eingeschossen hast (wovon ich nicht wirklich Peil hab) kannst du ja eine der Obigen Alternativen anschauen.

    Rapidxml und tinyxml haben leider den Nachteil das kein großes Projekt dahinter steht.
    Wer sorgt sich um die Bugs/Sicherheitslücken/Features?
    Hinter libxml ist das gnome projekt..
    kann auch sein dass meine Bedenken haltlos sind.
    Hatte noch nie etwas mit XML zu tun.

    Daher wäre ich für jedes Beispiel dankbar.

    Wie könnte man die UTM/Edge Objekte schnell und ohne Umwege
    in integer und doubles reinstecken? Erstmal keine Typprüfung
    oder Ähnliches.

    Darüber kann ich mir später den Kopf zerbrechen.


  • Administrator

    darkfate schrieb:

    Rapidxml und tinyxml haben leider den Nachteil das kein großes Projekt dahinter steht.
    Wer sorgt sich um die Bugs/Sicherheitslücken/Features?
    Hinter libxml ist das gnome projekt..
    kann auch sein dass meine Bedenken haltlos sind.

    Sicherheitslücken? Features? Wie bitte? Das sind simple einfache Parser. Die werden wohl auch kaum noch gross weiterentwickelt. Die nimmt man in der aktuellen Version, wenn sie einem passen, also die benötigte Funktionalität anbieten.
    RapidXml wird übrigens von Boost benutzt, ich denke daher, dass da schon gewisse Leute dahinter stehen, welche für das Fortkommen sorgen. Aber viel braucht es da nicht, da RapidXml ein extremes Leichtgewicht ist. Und Bugs kann bei so kleinen Bibliotheken auch ein einzelner Entwickler eliminieren. Und irgendwann sind die Bibliotheken so oft schon benutzt worden, dass man davon ausgehen kann, dass sie bugfrei sind.

    Aber spezifische Hilfe zu libxml bekommst du hier wohl eher nur mühsam, denn:
    1. libxml ist in C geschrieben! Somit eigentlich schon falsches Forum.
    2. Solche Bibliothek begzogene Fragen sollte man besser in den Foren der Bibliotheken fragen bis auf ein paar Ausnahmen.

    Grüssli



  • Ich finde PugiXML sehr schön gemacht.
    Simon



  • Es ist ja schön und gut die namen zu kennen.
    Wie siehts mit einem Beispiel zum obigen Datensatz aus?



  • darkfate schrieb:

    Wie siehts mit einem Beispiel zum obigen Datensatz aus?

    AFAIK kommst du da gar nicht ran 😛
    Ganz oben steht eigentlich nur Info zum XML-Dokument (Version usw)
    Deine Daten liegen alle unterhalb EINES Root-Elements. Also ist das XML nicht Standard-Konform. Bin aber nicht der XML-Spezialist und kenn die genaue Spezifikation nicht, kann also sein dass ich mich irre 😛

    Ansonsten steht hinter XML lesen nicht sooo viel Magie.
    http://rapidxml.sourceforge.net/manual.html
    Wenn du PugiXml (http://pugixml.googlecode.com/svn/trunk/docs/index.html) nimmst, kannst du viele Sachen einfacher gestalten dank XPath. Dazu sagt dir (u.A.) Wikipedia, wie so ein Query dann ausschaut.



  • l'abra d'or schrieb:

    darkfate schrieb:

    Wie siehts mit einem Beispiel zum obigen Datensatz aus?

    AFAIK kommst du da gar nicht ran 😛
    Ganz oben steht eigentlich nur Info zum XML-Dokument (Version usw)
    Deine Daten liegen alle unterhalb EINES Root-Elements. Also ist das XML nicht Standard-Konform. Bin aber nicht der XML-Spezialist und kenn die genaue Spezifikation nicht, kann also sein dass ich mich irre 😛

    Super. Jetz werden wir konkret 🙂
    Jetzt nur noch ein Beispiel einer richtigen xml Datei und wie man diese in structs oder arrays schreiben kann.

    Natürlich suche ich nebenbei auch selber... auch wenn es nicht so aussehen mag. Ich versuche hier mein Vorhaben zu beschleunigen.



  • Jippie, wie ichs mir gedacht hab.
    http://validator.w3.org/#validate-by-input
    Gib dein XML mal da ein. -> Errors.
    Lösche DEINE version und image-nodes, dann ist es valid.

    Zum Parsen:
    Du musst einfach die entsprechende Methode zum finden einer node auf eine andere node anwenden. Diese Methoden heißen "first_child", "find_node" oder so. Da gibst du den Namen mit. "Topology" wäre der Name deiner document-root-node. Diese find_node-Methode wendest du Step-by-Step (meist in ner while-Schleife) auf das zuletzt gefundene an, bis du bei deiner Node bist. Evtl. brauchts ein next_sibling, falls du auf einer Ebene mehrere Nodes mit gleichem Namen hast.
    Wenn du zur Unterscheidung noch ein Attribute heranziehen willst, bietet dir z.B. PugiXML noch das "find_child_by_attribute". Wenn du lange geschachtelte Abfragen hast, bietet pugixml auch XPath (xml_node::select_single_node, xml_node::select_nodes), oder wenns einfacher gestrickt ist ein "xml_node::first_element_by_path". Die Dokus zu pugixml/rapidxml sind eigentlich nicht soooo schlecht. Da gibts ein paar Beispiele, anhand derer man sich vorwärts kämpfen kann. Diese werd ich jetzt nicht abtippen 😉



  • Hy

    Und selbst die Beispiele zu libxml find ich jetzt wirklich groß und sind recht gut gegliedert.
    Außerdem wäre es gut wenn du dir vllt diese Beispiele mal anschauen würdest damit du es selbst
    verstehst und entsprechend die Bibliothek einsetzten kannst.

    Es bringt dir leider nix wenn du dir die Arbeit machen lässt, du willst ja bestimmt was dabei
    lernen.

    Und nein ich kann dir kein Beispiel geben, da ich die Funktionalität von libxml für mein Projekt
    in entsprechende Klassen gekapselt habe. Aber diese werden auch bald wieder rausfliegen weil
    ich die Lib etwas zu groß find für mein kleines Projekt.

    Mfg marco


Anmelden zum Antworten