IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

comment supprimer un attribut ou un element d un fichier xml


Sujet :

Visual C++

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 326
    Points : 62
    Points
    62
    Par défaut comment supprimer un attribut ou un element d un fichier xml
    pour ajouter un element il suffit de le créer lui associer des attributs puis ajouter avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xxx->AppendChild(elem);
    pour supprimer un element ou un attribut comment on fait c est la meme logique avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xxx->RemoveChild(elem);
    merci

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    t'as essayé ? ca marche ?
    faut pas oublier de sauver le xml à la fin

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 326
    Points : 62
    Points
    62
    Par défaut
    justement j'ai essayer, il me genere cette exception comme quoi je suis pas au bon child
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    An unhandled exception of type 'System.ArgumentException' occurred in System.Xml.dll
     
    Additional information: The node to be removed is not a child of this node.
    pourtant ce que je fais je l ajoute avec append et je laisse le meme chemin (que pour append )comme ca je suis sur et je fais remove mais ca marche pas

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 326
    Points : 62
    Points
    62
    Par défaut
    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    XmlDocument^doc1 = gcnew XmlDocument();
    doc1->Load("c:\\test30.xml");
    XmlNode^ elem21 = doc1->CreateNode(XmlNodeType::Element, "file", nullptr);
    elem21->InnerText = "file111";
    for each (XmlNode^xn in doc1->ChildNodes[0]->ChildNodes)
    {
         if((xn->Attributes["id"]->Value->ToString()=="1"))
         {			
              for each (XmlNode ^xcn in xn->ChildNodes)
              {
                    if(xcn->Name->ToString()=="roles")
                    {
                           for each (XmlNode ^xcn2 in xcn->ChildNodes)
                           {
                              if((xcn2->Attributes["id"]->Value->ToString()=="1"))
                              {
                                     for each (XmlNode ^xxx in xcn2->ChildNodes)
                                     {
                                         if((xxx->Name->ToString()=="users"))
                                         {
                                              System::Windows::Forms::MessageBox::Show(xxx->Name->ToString());
                                               for each (XmlNode ^xxxm in xxx->ChildNodes)
                                                {
                                                     if((xxxm->Name->ToString()=="user"))
                                                     {
                                                         if(xxxm->Attributes["login"]->Value->ToString()=="login11")
                                                         {
                                                              for each (XmlNode ^xxxmm in xxxm->ChildNodes)
                                                               {
                                              System::Windows::Forms::MessageBox::Show("xxxmm\n"+xxxmm->Name->ToString()+"\n");
                                                xxxmm->RemoveChild(elem21);
                                                 }
                                           }
     
                                  }
                          }
     
                      }
                }
             }
          }
        }
      }
     }
    }
    System::Windows::Forms::MessageBox::Show("ca marche avant save");
    	doc1->Save("c:\\test30.xml");
    	System::Windows::Forms::MessageBox::Show("ca marche");

  5. #5
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 326
    Points : 62
    Points
    62
    Par défaut je suis vraiment bloqué!
    pour etre sur je fais le meme code avec Appendchild et je l utilise la fonction donc il m ajoute un node et je laisse la meme structure et je change juste le append en removechild

    et il me genere cette exception comme quoi il trouve pas le child ??!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    An unhandled exception of type 'System.ArgumentException' occurred in System.Xml.dll
     
    Additional information: The node to be removed is not a child of this node.

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    regarde ce mini exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	String ^monXml = "<data><item>1</item><item>2</item></data>";
    	XmlDocument ^xmlDoc = gcnew XmlDocument();
    	xmlDoc->LoadXml(monXml);
    	Console::WriteLine(xmlDoc->InnerXml);
    	XmlNode ^xPere = xmlDoc->ChildNodes[0];
    	XmlNode ^xn = xPere->ChildNodes[0];
    	xPere->RemoveChild(xn);
    	Console::WriteLine(xmlDoc->InnerXml);

  7. #7
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 326
    Points : 62
    Points
    62
    Par défaut
    ca j'ai deja essayé,
    meme en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RemoveChild(root->firstChild);
    il me supprime le premier node

    mais le pb c'est quand je le dirige vers un node precis, il me dis qu'il existe pas pourtant il existe et pour etre sur je l'ajoute et j'utilise le meme code au lieu de Apend je mets Remove donc je suis sur qu'il existe mais il me dit qu'il existe pas !!

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu serais pas sur le mauvais fils par hasard ?

  9. #9
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 326
    Points : 62
    Points
    62
    Par défaut
    voici mon fichier xml par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <levels>
      <level id="1">
        <roles>
          <role id="1">
            <users>
              <user login="login11" password="password11">
              </user>
              <user login="login12" password="password12">
                <file type="1" status="r" access="r" version="00" prop="x">file121</file>
                <file type="2" status="r" access="r" version="00" prop="x">file122</file>
                <user login="login11" password="password11">
                </user>
              </user>
            </users>
         </role>
        </roles>
      </level>
    et mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    XmlDocument^doc1 = gcnew XmlDocument();
     
     
     
    	doc1->Load("c:\\test30.xml");
     
     
     
    	XmlNode^ elem3 = doc1->CreateNode(XmlNodeType::Element, "user", nullptr);
     
     
    	XmlAttribute^ attribLogin = doc1->CreateAttribute("login");
    	attribLogin->Value = "login11";
    	elem3->Attributes->Append(attribLogin);
    	XmlAttribute^ attribPwd = doc1->CreateAttribute("password");
    	attribPwd->Value = "password11";
    	elem3->Attributes->Append(attribPwd);
    	elem3->InnerText = "";
    for each (XmlNode^xn in doc1->ChildNodes[0]->ChildNodes)
    			{
    			if((xn->Attributes["id"]->Value->ToString()=="1"))
    			{	
     
    				for each (XmlNode ^xcn in xn->ChildNodes)
    				{
    					if(xcn->Name->ToString()=="roles")
    					{
     
    						for each (XmlNode ^xcn2 in xcn->ChildNodes)
    						{
    							if((xcn2->Attributes["id"]->Value->ToString()=="1"))
    							{
     
    								for each (XmlNode ^xxx in xcn2->ChildNodes)
    								{
    									if((xxx->Name->ToString()=="users"))
    									{
     
    										//System::Windows::Forms::MessageBox::Show(xxx->FirstChild->Value->ToString());
    										for each (XmlNode ^xxxm in xxx->ChildNodes)
    										{
    											//root->RemoveChild(elem3);
     
    											//if(xxxm->Attributes["login"]->Value->ToString()=="login11")
    											//{
    												//for each (XmlNode ^xxxmm in xxxm->ChildNodes)
    												//{
    												//System::Windows::Forms::MessageBox::Show("xxxmm\n"+xxxmm->Name->ToString()+"\n");
    												//xxxmm->RemoveChild(elem21);
    												//}
    											//System::Windows::Forms::MessageBox::Show(xxx->ChildNodes[0]->Value->ToString());
     
    											xxxm->RemoveChild(elem3);
    											//xxxm->AppendChild(elem3);
    											//}
     
     
    										}
     
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    	}
    System::Windows::Forms::MessageBox::Show("ca marche avant save");
    	doc1->Save("c:\\test30.xml");
    	System::Windows::Forms::MessageBox::Show("ca marche");
    et pour etre sur la premiere fois j'utilise Append et ca m ajoute l element et apres je remplace dans le code append par remove, il me dit que je ce node ne contient pas le child

  10. #10
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 326
    Points : 62
    Points
    62
    Par défaut
    j utilise meme avant le remove :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System::Windows::Forms::MessageBox::Show(xxxm->Name->ToString());
    et il m affiche user donc je suis bien dans le bon child ??

  11. #11
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 326
    Points : 62
    Points
    62
    Par défaut
    si je fais :append et puis le remove ca marche ! c'est à dire que le pb vient de la declaration de l element elem3
    :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    XmlDocument^doc1 = gcnew XmlDocument();
     
     
     
    	doc1->Load("c:\\test30.xml");
     
     
     
    	XmlNode^ elem3 = doc1->CreateNode(XmlNodeType::Element, "user", nullptr);
     
     
    	XmlAttribute^ attribLogin = doc1->CreateAttribute("login");
    	attribLogin->Value = "login11";
    	elem3->Attributes->Append(attribLogin);
    	XmlAttribute^ attribPwd = doc1->CreateAttribute("password");
    	attribPwd->Value = "password11";
    	elem3->Attributes->Append(attribPwd);
    	elem3->InnerText = "";
    je crois qu'il faut pas créer le node :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    XmlNode^ elem3 = doc1->CreateNode(XmlNodeType::Element, "user", nullptr);

  12. #12
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 326
    Points : 62
    Points
    62
    Par défaut
    j'ai trouvé

    il y a pas besoin de créer l'élement (elm3)
    et au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xxxmm->RemoveChild(elem21);
    il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xxxm->RemoveChild(xxxmm);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout d'un element dans un fichier XML
    Par vacknov dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2007, 11h26
  2. [JDOM] problème de suppresion d'un element d'un fichier xml
    Par tareksc dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 29/05/2007, 18h48
  3. [C# 2.0] Inserer un element dans un fichier Xml
    Par Khrysby dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/09/2006, 18h05
  4. Réponses: 3
    Dernier message: 29/06/2006, 17h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo