Boost Property Tree



  • Hallo ich schreibe gerade ein Programm in dem meherere XML und INI files geschrieben und gelesen werden müssen.
    Unter anderem deswegen hab ich mir die Boost lib installiert und jetzt möchte ich mit dem Property Tree die INI/XML files lesen/schreiben.

    Ich versteh nur noch nicht so ganz wie das funktioniert.

    Also ich weiß wie ich eine Datei lese/schreibe mit dem xml/ini_read/write
    aber ich werd aus dem ptree kram nicht so ganz schlau.

    z.B was ist der unterschied zwischen ptree.put, ptree.put_child, ptree.add und ptree.add_child und dann das ganze auch noch mit get und get_child?

    wäre schön wenn mir jemand nen paar beispiele mit erklärung posten könnte.

    Grüße



  • weiß wirklich keiner etwas?



  • ptree baut dir aus deinem Content (ini, XML datei) quasi einen baum auf, bzw fuegt sie in einen Knoten ein.

    Lies dich mal in REST ein, damit sollte dir vom prinzip her einiges klarer werden.
    http://de.wikipedia.org/wiki/Representational_State_Transfer

    wie der Name von Tree schon sagt, handelt es sich um baueme (Hirarchien) deren Knoten genau einen Value (string) speichern können.

    Das Standard PUT macht also genau das was es soll, es fuegt den Value an einem Bestimmten Punkt im baum ein ... wenn die Knoten nicht existieren, werden sie erzeugt, ansonsten überschrieben. Das geht also ueber mehrere Hirarchien.
    Hirarchie Trennzeichen ist der Punkt beim ptree.

    ein pt.put("A.B.C","Mein Text")
    Setzt also den Value ueber Mehrere Hirarchieebenen hinweg.
    Funktioniert natuerlich hnur, wenn ein Parent nur eindeutige Childs hat.
    Hat er mehrere childs gleichen namens, musst du per hand dich durch den Baum hangeln.

    std::string strValue = pt.get("A.B.C",std::string());
    liefert dir dann auch den value ueber mehrere Hirarchien hinweg. Sollte man nur machen wenn Parent-Child eindeutig ist. ist es dass nicht, ist das Ergebnis unbestimmt.
    Wenn knoten nicht existiert, bekommst den 2. parameter (in unserem fall den std::string() ) als default-wert durchkopiert.

    Wenn du statt dem Text einen Knoten(weil den Knoten scho als Instanz hasst, bzw der Einzufügende Knoten selber auch Subknoten schon hat) einfuegen willst, nimmst du die put_child methode.

    Unterschied zwischen put_child und add_child:
    put_child ueberschreibt den Zielknoten, wenn er existiert, add_child fuegt, wenn der Zielknoten schon existiert, nen zweiten Knoten gleichen namens auf der selben Ebene hinzu ...

    get_child() liefert dir analog statt den Wert(string) ne refernz auf nen Knoten
    existiert der zielknoten nicht, gibts ne ptree_bad_path - exeption

    Alternativ kannst du duch natuerlich auch mittels den iteratoren durch den baum hangeln (wenn abfragen musst, welche knoten es gibt) und mit data() den Wert lesen / modifizieren

    Ciao ...



  • Danke für die Antwort ich denke aber ich benutz doch lieber pugiXML, da ichs besser verstehe und nur für die ini dateien boost.

    EDIT: außerdem was ist eigentlich der "value" von nem node? Ein XML node kann doch mehrere Attribute haben.
    Bei pugiXML kann man mit:

    doc.child("node").attribute("attribute").value();
    

    die einzelnen nodes und attribute auslesen.

    grüße darman96



  • Das steht bei der Beschreibung des XML Parsers: http://www.boost.org/doc/libs/1_52_0/doc/html/boost_propertytree/parsers.html#boost_propertytree.parsers.xml_parser.

    Der "Wert" eines XML-Knotens ist der enthaltene Text, die Attribute kann man über die Subknoten unter "<xmlattr>" abfragen.

    Und wenn du dich ein bisschen mit Property Tree auseinandersetzt ist das so ziemlich die einfachste (aber auch beschränkteste) XML-Handling Bibliothek, die es gibt. Falls man nicht mehr (Namespaces, SAX, ...) braucht, würde ich die Bibliothek definitiv empfehlen.



  • boost property_tree ist keine XML-Handling Bibliothek. Wer mit Attributen bei property_tree rumfriemelt, macht was falsch. Wenn man sich zum Beispiel den ini/json Umfang anschaut und dann sieht, was property_tree so kann, dann sind das viel bessere Nutzungsbeispiele (nebenbei ist json auch viel schöner und ein besseres Format als XML für diese Aufgabe).



  • Ner Dom Impl kann PTree natürlich nicht das Wasser reichen ...
    Innis und Json gibts auch umfangreichere Bibs ...

    Aber:

    Wenn man eh schon boost verwendet, macht das einbinden von PTree keine muehe und es existiert fuer alle c++ plattformen.

    Es ist Zeichensatzunabhaengig ...

    Und es Implementiert den PUT/GET recht gut find ich ...

    Damit ist es eigentlich Ideal fuer Daten in Baumform, mit nuetzlicher Serialisierungsfunktion ... besonders wenn das Dateiformat nur 2.rangig ist.
    Als richtigen parser würd ichs nicht hernehmen ...

    Caio ....


Anmelden zum Antworten