pour ajouter un element il suffit de le créer lui associer des attributs puis ajouter avec :
pour supprimer un element ou un attribut comment on fait c est la meme logique avec :Code:xxx->AppendChild(elem);
merciCode:xxx->RemoveChild(elem);
Version imprimable
pour ajouter un element il suffit de le créer lui associer des attributs puis ajouter avec :
pour supprimer un element ou un attribut comment on fait c est la meme logique avec :Code:xxx->AppendChild(elem);
merciCode:xxx->RemoveChild(elem);
t'as essayé ? ca marche ?
faut pas oublier de sauver le xml à la fin
justement j'ai essayer, il me genere cette exception comme quoi je suis pas au bon child
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 pas8OCode:
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.
voici mon code :
Code:
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");
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:
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.
regarde ce mini exemple
Code:
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);
ca j'ai deja essayé,
meme en utilisant
il me supprime le premier nodeCode:RemoveChild(root->firstChild);
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 !!
tu serais pas sur le mauvais fils par hasard ?
voici mon fichier xml par exemple :
et mon code est le suivant :Code:
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 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 childCode:
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");
j utilise meme avant le remove :
et il m affiche user donc je suis bien dans le bon child ??Code:
1
2 System::Windows::Forms::MessageBox::Show(xxxm->Name->ToString());
si je fais :append et puis le remove ca marche ! c'est à dire que le pb vient de la declaration de l element elem3
:
je crois qu'il faut pas créer le node :Code:
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 = "";
Code:
1
2 XmlNode^ elem3 = doc1->CreateNode(XmlNodeType::Element, "user", nullptr);
j'ai trouvé :yaisse2:
il y a pas besoin de créer l'élement (elm3)
et au lieu de
il fautCode:xxxmm->RemoveChild(elem21);
Code:
1
2 xxxm->RemoveChild(xxxmm);