XML zur Daten- Ein/Ausgabe & als Konfigurationsdatei?



  • Hey.

    Das Ein- und Auslesen von strings in/aus eine/einer .txt Datei hat soweit ich weis nicht sehr viel zu bieten. (Hoffe mich da nicht zu irren 🙂 )
    Während meiner diesbezüglichen Recherche im Internet bin ich dann auf XML gestoßen.
    Ist es mittels C++ möglich, eingelesene Daten oder Konfigurationseinstellungen (in Form von Variablen-Werten) in XML-Dateien zu schreiben, und diese dann gezielt auszulesen (z.B.: nur den Wert der Variable x aus der Datei "Konfig.xml" oder den Text mit dem Titel "ABC" aus der Datei "Texte.xml")? 😕

    btw.: Kennt gegebenenfalls jemand eine Seite/ ein e-book o.ä. zum Thema C++ und XML?

    Grüße



  • Hallo

    Dazu brauchst du externe Bibliotheken wie tinyXML.

    bis bald
    akari



  • Danke für die schnelle Antwort.

    Soll das heißen mein Vorhaben XML sowohl zum Speichern eingelesender Texte als auch als Konfigurationsdatei zu verwenden ist tatsächlich sinnvoll? Oder ist es einfach nur möglich das zu tun? 😃
    Gibt es bessere/effektivere Möglichkeiten?

    btw.: Wird XML in professioneller Software ebenfalls für diese Zwecke verwendet?

    Grüße



  • XML ist doch nur ein Format von vielen. Man muß es nicht einsetzen, man kann. Es hat auch nichts mit professionell zu tun. Wenn du einfache Datenstrukturen hast, kannst du auch einfach ein Property-Format benutzen:

    variable1=hallo
    variable2=ich bin doof
    variable3=123
    

    Hat nur den Nachteil, das bei komplexeren Datenstrukturen das Handling schwieriger wird.

    Wenn du binäre Daten hast (z.B. Sound) kannst du die auch in XML speichern. Aber deswegen ist es noch lange nicht professioneller als das binäre MP3-Format. Es hat halt nur einen anderen Grund, warum man es denn so machen will.

    Andere benutzen gar Embedded-Databases, z.B. die BerkleyDB. Damit kann man seine Daten in einer lokalen RDBMS (kein Remoteserver!) speichern, weil es einem pers. besser gefällt bzw. weil man so die Daten besser handlen kann. Muß man aber nicht, kann man.

    Wie und was du machst, wird dir hier keiner sagen können. Je nach Anforderung, kann man sich sein Format und Technik aussuchen.



  • Was ich mit "professionell" meinte, war ob ich XML mit meinem Vorhaben zweckendfremde, oder ob es auch von erfahrenen Programmierern in dieser Weise eingesetzt wird. 🙂
    (Wie man möglicherweise schon gemerkt hat, bin ich in Sachen C++ noch nicht sehr geübt, daher bitte ich diesbezüglich um Vertändnis.)

    Deine Antwort wirft für mich allerdings gleich eine andere Frage auf:
    Was ist ein Property-Format?

    Kann mir jemand vielleicht ein Buch zum Thema "C++ & XML" empfehlen?

    Grüße



  • Kann mir jemand vielleicht ein Buch zum Thema "C++ & XML" empfehlen?

    Sowas gibts doch nicht.



  • lol. Danke Batman! 😃
    Eben weil ich sowas nicht finden kann hab ich danach gefragt 🙂

    Mein Problem ist nämlich, dass ich zwar reine XML Bücher finde, in denen aber kein Wort zur Verwendung mittels C++ verlohren wird, mein C++ Buch hingegen auch nicht auf die Verwendung von XML eingeht geschweigedenn dessen Existenz erwähnt.

    Ich nehm aber auch gerne e-books, Faq's und Tutorials, wenns davon auf dieses Thema bezogen mehr gibt 😉

    Grüße



  • Verstehe C++.
    Verstehe XML.
    Lies die TinyXML Dokumentation und dann klappts.



  • Hehe. Was wohl passiert, wenn ich dich jetzt Biene Maja nennen würde, also rein hypothetisch natürlich *g*

    Möglicherweise hast du damit ja Recht, allerdings resultiert aus dem Verständnis von C++ und XML noch lange nicht die Fähigkeit beides zu kombinieren.
    Möglicherweise kannst du mir ja beantworten was ein Property-Format ist? 🙂

    Grüße

    Edit: Na gut. die TinyXml Dokumentation könnte mir beim Kombinieren helfen 🙄



  • Artchi schrieb:

    Wenn du binäre Daten hast (z.B. Sound) kannst du die auch in XML speichern.

    Nein, kann er nicht, da XML keine Mechanismen zur Speicherung binärer Daten bietet.



  • Ist es nicht aber möglich sowohl Bilder, Videos als eben auch Musikdateien in XML nicht nur einzubinden, sondern auch direkt in der .xml-Datei zu speichern (wenn auch nicht binär 😕 )?
    Hab sowas zumindest in Erinnerung, denk ich (hab ich wohl irgendwo gelesen).

    Grüße

    Edit: Wenn nicht binär, dann wüsste ich allerdings auch nicht wie sonst 🙂



  • Natürlich kann man binäre Daten in einer XML Datei einbetten, hab ich bei uns auch so gemacht. Es gibt ja sogar ein extra XML-Tag wo man binäre Daten unter bringen kann: CDATA nennt sich das. Natürlich muß man diese vorher z.B. mit einem Algorithmus konvertieren. Man kann die Daten mit Base64 konvertieren, kein Problem.



  • Um auf dein eigentlich Problem zurück zukommen. Property-Datei heißt einfach Schlüssel-Wert Paare zu speichern. Das ganze durch ein Gleichzeichen trennen. Also pro Variable für deine Konfiguration ein Property und dazu den Wert. Siehe mein erstes Posting.

    XML-Datein machen dann Sinn, wenn du baumartige Daten hast.

    Z.B. sowas, wenn es ein Vectorgrafik-Programm wäre, hättest du Objekte für Kreise, Linien, und z.B. einen Grafiklayer:

    Layer
       +-Kreis
       |
       +-Rechteck
       |
       +-Groupe 1
       | |
       | +-Linie
       | +-Kreis
       |
       +-Pfeil
    
    usw.
    
    class gfx_object {
       gfx_object *parent;
       std::vector<gfx_object*> childs;
    };
    

    Diese Objekte in eine Property-Datei zu speichern kann nervig sein. Vorallem weil alle Objekte auch noch Attribute haben, z.B. X/Y-Koordinaten, Farben, Linienstärke usw. Nun ist XML auch eine Baumstruktur, ideal um seine Objekte rekursiv zu durchlaufen und ihre Eigenschaften an den XML-Stream zu schicken, der dann die XML-Datei rausschreibt.

    Beim einlesen gehts dann auf umgekehrten Weg.

    Diese Vorgehensweise hat aber nichts speziell mit C++ zu tun, sondern gilt auch für Java, C# usw. Deshalb wird dir jetzt hier niemand konkret eine Antwort speziell für C++ geben und auch kein Buch empfehlen können. Es hat einfach was mit allgemeinen Programmierer-Verständnis und -Denken zu tun. Entweder man rafft es oder nicht. Sowas lernt man in dem man Erfahrung hat oder sich in fremden Code umschaut... kann auch Java-Code sein den man dann in C++ umsetzt und vielleicht ein paar C++ Denkweisen einfliessen lässt.



  • Wow. das war mahl ausführlich. 🙂
    Zunächst danke für die detailierte Erklährung (nur bei Vektoren bin ich beim lernen noch nicht angelangt 😃 ).

    Wenn ich also folgendes tun würde:

    int var1(1), var2(2), var3(3);
    ofstream konfig("konfig.txt", ios::_Noreplace);
    konfig<<"var1="<<var1<<"\n"
          <<"var2="<<var2<<"\n"
          <<"var3="<<var3<<endl;
    

    hätte ich eine "handelsübliche" Konfigurationsdatei aus der ich beim nächsten Programmstart z.B.: nur den Wert der Variable var2 auslesen könnte (also nur '2')? Wie kann ich geziehlt auf bestimmte Informationen innerhalb einer Datei zugreifen?

    btw.: Gibt es nicht komfortablere Möglichkeiten Daten in Dateien zu schreiben als filestreams? (Das was ich im code- Beispiel gemacht hab erscheint mir etwas zu aufwendig, wenn man bei einem größerem Programm z.B.: mehrere hundert Werte für gesetzte Einstellungen, Farben, Größen, etc. speichern muss - und das aus optischen Gründen gerne in einer netten Formatierung machen will - die wohlgemerkt nicht in einer Baumstruktur verschachtelt sind. 😕 )

    Grüße



  • Also vom Prinzip her ist es schon richtig was du da gemacht hast. Dir bleibt tatsächlich nicht anderes übrig, als jede Variable einzeln rauszuschreiben und entsprechend den Code zu schreiben.

    Variablen aus einer Datei "raussuchen" gibt es in dem Sinne nicht. Man liest die ganze datei ein und parsed sie dann. Da gibts ganz primitive Verfahren, Propertydateien sind eine Variante.

    Andere benutzen wie gesagt embedded Databases, wo man dann eine Suchanfrage machen kann. Aber für Konfig-Dateien ist das mit Kanonen auf Spatzen geschossen.

    Wenn du vieeeele Variablem hast, kannst du auch eine std::map benutzen, und darin deine Werte speichern. Und dann diese mit einer for-Schleife in eine Propertydatei raus schreiben... das wäre am wenigsten Code.

    Es gibt natürlich schon fertige Libs, die man benutzen kann (würde es aber trotzdem einfach selbst versuchen, um Erfahrung zu sammeln):
    http://www.boost.org/doc/html/program_options.html

    Bei einer Baumstruktur: wie gesagt, rekursiv den Baum durchlaufen und die Objekte in ein XML rausschreiben. Ist nur ein Aufruf...

    Eleganter gehts eigentlich nicht... ich würde es einfach mal in Code umsetzen. Mit der Zeit wirst du selbst sehen, was wie geht. Und es gibt schon fertige Sachen (wie bei Boost, oder TinyXML) die einem das abnehmen.



  • Also eine sehr unpraktische Sache *g*
    Kannst du mir bitte das mit dem Parsen noch einmal erläutern? 🙂

    Es tut mir zwar Leid, dir so viel Arbeit zu machen, aber auch mit std::maps kann ich nicht viel anfangen 😃 (außer, dass std der Namensbereich ist 🙂 ).
    Ja, also embedded Databases werd ich wohl vorerst nicht verwenden, sondern mich, wie du es mir empfohlen hast, zuerst mit dem manuelen code schreiben auseinandersetzen.

    Noch eine beiläufige Frage:
    Macht es außer dem Symbolisieren, dass es sich um eine Konfigurationsdatei handelt, einen Unterschied, statt konfig.txt eine konfig.ini zu erstellen?

    btw.: Danke für deine geduldige und detailierte Hilfe!
    Grüße


Anmelden zum Antworten