wxXmlNode: seltsamer Fehler beim Setzen eines Wertes



  • Hallo,

    wenn ich mit dem nachfolgenden Quellcode versuche, für ein bereits vorhandenes aber noch leeres Element einen Wert zu setzen, stürzt mein Programm ab, ist bereits ein Wert gesetzt, so wird dieser erfolgreich überschrieben. Was mache ich falsch?

    Vielen Dank im Voraus für jegliche Hilfe.

    wxXmlDocument doc;
        wxXmlNode *node = doc.GetRoot()->GetChildren();
        wxXmlNode *contentnode;
    
        while(node)
        {
            if(node->GetName() == wxT("node1"))
            {
                contentnode = node->GetChildren();
                contentnode->SetContent(wxT("wert1"));
            }    
    
            else if(node->GetName() == wxT("node2"))
            {
                contentnode = node->GetChildren();
                contentnode->SetContent(wxT("wert2"));
            }
    
            else if(node->GetName() == wxT("node3"))
            {
                contentnode = node->GetChildren();
                contentnode->SetContent(wxT("wert3"));
            }
    
            node = node->GetNext();
        } 
    
        doc.Save(wxT("nodes.xml"));
    


  • Was liefert wxXmlNode::GetChildren() wohl zurück, wenn noch kein Kind enthalten ist? Darf man darauf zugreifen? Kann man da was prüfen?
    -> Beschäftige dich mit NULL-Pointern.
    (BTW. könnte in der Doku sowas schon erwähnt werden...)



  • Vielen Dank, hast mich an der richtigen Stelle zum Nachdenken gebracht. 😉
    Funktioniert nun mit folgendem Code:

    wxXmlDocument doc;    
        wxXmlNode *node = doc.GetRoot()->GetChildren();
        wxXmlNode *contentnode;
    
                while(node)
                {
                    contentnode = node->GetChildren();
                    if(node->GetName() == wxT("node1"))
                    {
                        if(SetContent(node, contentnode, wxT("wert1")))
                            continue;
                    }
    
                    else if(node->GetName() == wxT("node2"))
                    {
                        if(SetContent(node, contentnode, wxT("wert2")))
                            continue;
                    }
    
                    else if(node->GetName() == wxT("node3"))
                    {
                        if(SetContent(node, contentnode, wxT("wert3")))
                            continue;
                    }
    
                    node = node->GetNext();
                } 
    
        doc.Save(wxT("nodes.xml"));
    

    Und hier die Funktion SetContent:

    bool SetContent(wxXmlNode *node, wxXmlNode *contentnode, wxString content)
        {
        wxXmlNode *textnode;
    
        if(node->GetChildren()== NULL)
        {
            textnode = new wxXmlNode(node, wxXML_TEXT_NODE, wxT("text"), content);
            node->SetChildren(textnode);
    
            node = node->GetNext();
            return TRUE;   
        }
    
        contentnode->SetContent(content);
        return FALSE;
        }
    

Anmelden zum Antworten