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.


Anmelden zum Antworten