[gelöst]TinyXml Fehler bei SetValue



  • Hallo

    Ich habe ein kleines Problem beim Setzen eines Textelements in einer XML Datei.

    Ich habe folgenden leeren Tag in der XML Datei:
    <ph_res></ph_res>

    Nun möchte ich über mein eingebundenes TinyXml (vorheriges lesen der gesamten XML Datei klappt einwandfrei) einen Wert für diesen Tag setzen, beispielsweise "55".

    Dazu folgender Quellcode:

    TiXmlDocument doc(pathname)
    bool loadOkay = doc.LoadFile();
    
    if (!loadOkay)
    {
       std::cout << doc.ErrorDesc() << endl;
    }
    else {
    
       TiXmlHandle docHandle(&doc);
       TiXmlText* text = docHandle.ChildElement("ph_res",0).Text();
       text->SetValue("55");
    }
    

    Wird alles super compiliert, allerdings beim Ausführen der Konsolenanwendung, bricht das Programm ab. Habe den Debugger bemüht, Fehler tritt auf in der von tinyxml mitgelieferten "tinystr.h" und zwar bei:

    //Return capacity of string
    size_type capacity () const {return rep_->capacity;}
    

    Folgende Fehlermeldung: "Unhandled exception in test.exe: 0xC000000005 Access Violation" für capacity gibt er 0x00405000 zurück, wenn das jemanden irgendwas sagen sollte.

    Wäre schön wenn mir jemand auf die Sprünge helfen könnte. Danke



  • Geh mal im Callstack ein paar Ebenen nach oben und schau nach, auf welchem Weg du zu dem capacity()-Aufruf gekommen bist. (btw, geht es hier um std::string::capacity()?)



  • Da ich STL nicht verwende nimmt er die TiXmlString-Klasse. capacity stammt also von dort. Wenn ich STL verwende, ist zwar die Fehlermeldung verschwunden aber alles andere funktioniert logischerweise auch nicht mehr.



  • kleiner Nachtrag,

    auf der TinyXML Webseite hat man mir empfohlen, statt der Text(), die ToText() Funktion der FirstChild() Funktion zu verwenden.
    Code sieht nun so aus:

    TiXmlHandle docHandle(&doc);
    TiXmlText* text = docHandle.ChildElement("ph_res",0).FirstChild().ToText();
    text->SetValue("55");
    

    Tritt aber leider noch immer der genannte Fehler auf. 😞



  • MRTcharlie schrieb:

    Da ich STL nicht verwende nimmt er die TiXmlString-Klasse. capacity stammt also von dort.

    Hmm, dann solltest du trotzdem mal den Call-Stack unter die Lupe nehmen.

    (nur mal als Test: Tritt der Fehler eigentlich auch auf, wenn der betroffene XML-Tag vorher nicht leer war?)



  • Es machte keine Unterschied ob der Tag leer oder was enthalten war. Gab immer den Fehler. Ich glaube letztendlich war die Angabe des Knotens nicht korrekt, obwohl es in der TinyXML Hilfe exakt so beschrieben ist.

    Trotzdem habe ich eine Lösung gefunden 🙂

    Ich fange beim Wurzel-Element an und arbeite mich Schritt für Schritt durch Abarbeitung der einzelnen Knoten durch das XML Dokument. Benutze hierfür die NextSibling() Funktion.

    TiXmlNode* node = 0; 
    node = doc.RootElement(); // node zeigt jetzt auf Wurzelknoten
    node = node->FirstChild(); 
    
    while(strcmp(node->Value(), "ph_res") != 0) //durchsuche Knoten und vergleiche ob mit ph_res übereinstimmt 
    { 
    node = node->NextSibling(); 
    } 
    // wenn Übereinstimmung
    
    TiXmlElement* element = node->ToElement(); 
    TiXmlText text ( "55"); 
    element->InsertEndChild(text);
    

Anmelden zum Antworten