2015-04-08 1 views
0

Ma question est la suivante: est-il possible de modifier les données dans un élément xml?Mise à jour des données dans un petit élément XML

Ce que je veux faire est de changer les données dans l'élément en fonction de quel bouton est pressé. Je l'ai actuellement en train de lire et d'écrire dans le fichier xml, mais je veux le changer, écrire un nouvel élément la première fois et ensuite éditer l'élément comme il continue à écrire un nouvel élément à chaque fois.

Ceci est mon code actuel pour écrire le nouvel élément

if (doc.LoadFile(XMLDOC) == tinyxml2::XML_SUCCESS){ 
    //Get Root Node 
    tinyxml2::XMLElement* rootNode = doc.FirstChildElement();//Assets 
    //Get Next Node 
    tinyxml2::XMLElement* childNode = rootNode->FirstChildElement();//imagePaths 
    //Temp Element 
    tinyxml2::XMLElement* temp = nullptr; 
    tinyxml2::XMLElement* temp2 = childNode->FirstChildElement();//path 

    while (temp2 != nullptr){ 
     temp = temp2; 
     temp2 = temp2->NextSiblingElement("path"); 
    } 
    if (temp != nullptr){ 
     //write the text 
     tinyxml2::XMLComment* newComment = doc.NewComment("Selected Player"); 
     tinyxml2::XMLElement* newElement = doc.NewElement("path"); 

      //get text passed in 
      newElement->SetText(choice.c_str()); 

      newElement->SetAttribute("name", "selected_player"); 
      childNode->InsertAfterChild(temp, newComment); 
      childNode->InsertAfterChild(newComment, newElement); 

    } 
    //doc.Print(); 
    doc.SaveFile(XMLDOC); 
    } 
    else{ 
     std::cout << "Could Not Load XML Document : %s" << XMLDOC << std::endl; 
    } 
} 

Merci d'avoir contribué à l'avance

Répondre

1

Je ne suis pas 100% sûr de ce que le comportement souhaité vous voulez. Voici un exemple de code basé sur de votre code exemple de question:

#include "tinyxml2.h" 
#include <iostream> 
#include <string> 

#define XMLDOC "test.xml" 

std::string choice = "New Text"; 

int main() 
{ 
    tinyxml2::XMLDocument doc; 
    if (doc.LoadFile(XMLDOC) == tinyxml2::XML_SUCCESS){ 
     //Get Root Node 
     tinyxml2::XMLElement* rootNode = doc.FirstChildElement();//Assets 
     //Get Next Node 
     tinyxml2::XMLElement* childNode = rootNode->FirstChildElement();//imagePaths 
     //Path Node 
     tinyxml2::XMLElement* pathNode = childNode->FirstChildElement();//path 

     if (pathNode == nullptr){ 
     //write the text 
     tinyxml2::XMLComment* newComment = doc.NewComment("Selected Player"); 
     tinyxml2::XMLElement* newElement = doc.NewElement("path"); 

     newElement->SetAttribute("name", "selected_player"); 
     newElement->SetText(choice.c_str()); 

     childNode->InsertFirstChild(newComment); 
     childNode->InsertAfterChild(newComment, newElement); 
     } 
     else{ 
     pathNode->SetText(choice.c_str()); 
     } 
     doc.SaveFile(XMLDOC); 
    } 
    else{ 
     std::cout << "Could Not Load XML Document : " << XMLDOC << std::endl; 
    } 
} 

Compte tenu d'un fichier XML qui ressemble à ceci:

<Assets> 
<ImagePaths> 
</ImagePaths> 
</Assets> 

Après l'exécution, il ressemblerait à ceci:

<Assets> 
<ImagePaths> 
    <!--Selected Player--> 
    <path name="selected_player">New Text</path> 
</ImagePaths> 
</Assets> 

Et si vous réexécutez le programme, vous obtenez uniquement le nœud à chemin unique avec le texte que contient votre chaîne de choix.

Espérons que ça aide!

+0

Merci pour l'aide pas exactement ce dont j'ai besoin, mais a la fonctionnalité dont j'ai besoin. Devrait pouvoir obtenir ce que je veux travailler de lui. –

+0

Après un examen plus approfondi, cela fonctionne parfaitement pour moi .. juste besoin d'ajouter un élément par défaut à mon fichier xml en premier. –