TinyXml
-
hi leute
ich braeuchte langsam hilfe. ich versuch aus einer .xml datei auszulesen und krieg das nur halb gebacken.
#include "TinyXml.h" #include <iostream> #include <string> #include <sstream> const std::string FilePath ( "C:\\Users\\Albert\\Desktop\\Test.xml" ) ; int ConvertStrToInt ( const std::string& ) ; int main ( ) { TiXmlDocument Doc ( FilePath.c_str() ) ; Doc.LoadFile() ; // Hier bekomme ich die Elemente des 1. Abschnitts, aber wie bekomme ich die nächsten ? TiXmlElement* lblElem = Doc.FirstChildElement("Label") ; TiXmlElement* textElem = Doc.FirstChildElement("Text") ; TiXmlElement* xElem = Doc.FirstChildElement("x") ; TiXmlElement* yElem = Doc.FirstChildElement("y") ; // Schön ? std::cout << "Text: " << textElem->GetText() << std::endl ; std::cout << "x: " << ConvertStrToInt(xElem->GetText()) << std::endl ; std::cout << "y: " << ConvertStrToInt(yElem->GetText()) << std::endl ; } int ConvertStrToInt ( const std::string& Str ) { std::stringstream _tmp ; int Int ; _tmp << Str ; _tmp >> Int ; return Int ; }die .xml schaut so aus:
// 1. Abschnitt <Label> <Text>Hallo</Text> <x>23</x> <y>99</y> </Label> // 2. Abschnitt <Label> <Text>Hallo</Text> <x>23</x> <y>99</y> </Label>Nun ja, es funktioniert, aber:
.) ich musste mir eine eigene funktion fürs konvertieren schreiben, geht das nicht schöner ?
.) Wie greife ich auf den 2. Abschnitt zu ? Ein kleines Sample wäre sehr hilfreich.
.) In der Doku konnte ich nichts passendes finden um auf den 2. Abschnitt zu greifen zu können.bedanke mich im voraus !
gruß albert
-
Es gibt NextChildElement(), da übergibst du den ersten, dann kriegst du den zweiten.
-
x und y sollte so gar nicht funktionieren, du musst dafür schon das child con lblElem abfragen.
-
hi optimizer
nextchildelement existiert gar nicht in der doku

x und y sollte so gar nicht funktionieren, du musst dafür schon das child con lblElem abfragen.
könntest du das genauer erklären?
gruß albert t.
-
Ich denke NextSilbling ist was du suchst
Doc.LoadFile() ; TiXmlElement* labelNode = Doc.FirstChildElement("Label") ; while( labelNode ) { TiXmlElement* textElem = labelNode->FirstChildElement("Text") ; TiXmlElement* xElem = labelNode->FirstChildElement("x") ; TiXmlElement* yElem = labelNode->FirstChildElement("y") ; std::cout << "Text: " << textElem->GetText() << std::endl ; std::cout << "x: " << ConvertStrToInt(xElem->GetText()) << std::endl ; std::cout << "y: " << ConvertStrToInt(yElem->GetText()) << std::endl ; labelNode->NextSilbling("Label"); }So in der Art sollte das gehen. Das hab ich jetzt aber nicht getestet.
-
Whops, richtig. Ist schon zu lange he, dass ich meinen Wrapper drum rumgeschrieben habe.
könntest du das genauer erklären?
"Text", "x" und "y" sind doch in deinem XML-Dokument Kinder von "Label". In deinem code frägst du aber nach den Kindern von Doc mit diesen Namen.
-
Der erste Knoten erreicht man nur über das RootElement. Die Methode ist nur in TiXmlDocument definiert.
evilissimo schrieb:
Ich denke NextSilbling ist was du suchst
Doc.LoadFile() ; //TiXmlElement* labelNode = Doc.FirstChildElement("Label") ; TiXmlElement* labelNode = Doc.RootElement() ; while( labelNode ) { TiXmlElement* textElem = labelNode->FirstChildElement("Text") ; TiXmlElement* xElem = labelNode->FirstChildElement("x") ; TiXmlElement* yElem = labelNode->FirstChildElement("y") ; std::cout << "Text: " << textElem->GetText() << std::endl ; std::cout << "x: " << ConvertStrToInt(xElem->GetText()) << std::endl ; std::cout << "y: " << ConvertStrToInt(yElem->GetText()) << std::endl ; labelNode->NextSilbling("Label"); }So in der Art sollte das gehen. Das hab ich jetzt aber nicht getestet.