wxWidgets + XML
-
Liebe Profis
Ich habe mitlerweile ein kleines Formular in c++ (unter verwendung von wxWidgets) programmiert.
Nun würde ich gerne die Daten dieses Formulares speichern lassen.
Wie man dies mit einer normalen Text-Datei macht ist mir klar.wxFile newfile; newfile.Create(filename,true,wxFile::write); newfile.Write(content);
Aber wie dies mit XML genau funktioniert, will mir einfach nicht in den Kopf.
Hier noch den Verweis auf die Doku:
http://docs.wxwidgets.org/stable/wx_wxxmldocument.html#wxxmldocumentIch hoffe jemand von euch kann mir helfen.
Danke
-
Falsches Forum für das Thema. Bitte lies dir unbedingt den Thread "Du brauchst Hilfe?" im C++-Bereich einmal durch, bevor du dort postest. (Siehe auch meine Sig).
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo Tobias
Hinweise: Folgender Text kann auch falsch sein. Falls dies der Fall ist, bitte sagen
Die XML Class in der Doku dient dazu, einen gespeichertes XML Dokument bzw. einen XML-Stream zu analysieren, z.B. einzelne Zeilen aus dem Dokument herauslesen oder nur bestimmte Wert.
Wenn du das Dokument nur abspeicher willst, erstellst eine Instanz von wxXmlDocument. Anschliessend kannst mit der Methode save ein beliebiges XML-Dokument in diesem Objekt speichern.Beispiel:
wxXmlDocument doc; doc.Load(wxT("myfile.xml"), wxT("UTF-8"), wxXMLDOC_KEEP_WHITESPACE_NODES); // myfile2.xml will be indentic to myfile.xml saving it this way: doc.Save(wxT("myfile2.xml"), wxXML_NO_INDENTATION); //Zwar wird hier lediglich ein XML-Dokument kopiert, du solltest aber genau so //gut auch das Formular laden können anstelle von myfile.xml.
Der Parameter wxT("") legt den Zeichencode deines Dokuments fest.
Der Parameter wxXMLDOC_KEEP_WHITESPACE_NODES ist eigentlich selbsterklärend, er sagt, das die Lücken in dem Dokument ebenfalls geladen werden sollen.
Mit dem Parameter wxXML_NO_INDENTATION sagst du, dass keine automatischen Zeileneinrückungen (tabs) (indentations) erstellt werden sollen.
Somit ist das Dokument dann gleich dem ersten Dokument (myfile.xml).Alternativ kannst auch indentstep <zahl> anstelle von wxXML_NO_INDENTATION verwenden um die Anzahl der Zeilenenrückungen festzulegen.
MfG Samuel
-
Vielen Dank für die Hilfe ..
Ich habe nun selber was zusammen gebastelt bekommen ^^Hier meine Lösung - wahrscheinlich nicht das schönste:
Speichern:
wxXmlDocument newxml; wxXmlNode n_root, n_firstname, n_content_firstname; n_root.SetType(wxXML_ELEMENT_NODE); // type von root setzen element sind die tags n_root.SetName(_("root")); // name des elements - 'tags' n_root.AddChild(&n_firstname); // welche innereien hat das ding? weiter unten. // parent n_firstname n_firstname.SetType(wxXML_ELEMENT_NODE); // wieder ein element n_firstname.SetName(_("firstname")); // name des elementes n_firstname.AddChild(&n_content_firstname); // inhalt des elementes als node! weiter unten definiert // n_firstname_content n_content_firstname.SetType(wxXML_TEXT_NODE); // inhalt diesesmal als text_node n_content_firstname.SetContent(c_firstname); // der inhalt des inhaltes xD newxml.SetRoot(&n_root); // root verzeichnis (alle nodes finden sich hier) newxml.SetVersion(_("0.1")); // version definieren ^^ - optional newxml.Save(filename); // dateiname als wxstring
XML ergebnis:
<?xml version="0.1" encoding="utf-8"?> <root> <firstname>Max</firstname> </root>
Laden:
wxXmlDocument oldxml; newxml.Load(filename); // selbsterklärend - filename als string wxXmlNode *child = newxml.GetRoot()->GetChildren(); // alle children von dem root rausholen und in child stecken while (child) // solange es kinder hat durchführen { if (child->GetName() == _("firstname")) { content = child->GetNodeContent(); u_firstname = content; } // ergänzen .. soweit man will. pro element jeweils ein neues if ^^ child = child->GetNext(); }
die beschreibung ist vllt. teilweise auch ein wenig unglücklich .. ich hoffe irgendwer freud isch irgendwann mal trotzdem darüber ^^
-
Ist das Erzeugen eines XML-Files nicht mit den Standardfileoperationen und Strings einfacher ? Ist doch letztendlich nur eine ASCII-Datei....
-
Kleines Detail noch: wxXmlDocument würde gerne den ganzn xmlbaum löschen, wenn es deconstruiert wird. Wenn die xmlNodes wie oben auf dem Stack liegen, stürzt das ab. Also entweder die nodes auf dem Heap allokieren oder am Schluss ein newxml.DetachRoot() bewor der Scope verlassen wird.