Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
3547 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [Résolu] Mettre à jour/ajouter éléments dans un XML en C#

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Mettre à jour/ajouter éléments dans un XML en C#

n°2292440
recep
Posté le 22-11-2016 à 14:38:45  profilanswer
 

Bonjour à tous,
 
mon programme suivant ajoute des élements dans mon fichier XML "news.xml" :

Code :
  1. XmlDocument xmlDoc = new XmlDocument();
  2. xmlDoc.Load(@"c:\users\xxx\documents\xml\news.xml" );
  3. XmlNode recordNode = xmlDoc.SelectSingleNode("/entete" );
  4. recordNode.InnerText += Environment.NewLine + @"<AA>" + Environment.NewLine;
  5. recordNode.InnerText += @"<a>7</a>" + Environment.NewLine;
  6. recordNode.InnerText += @"<b>FFFF</b>" + Environment.NewLine;
  7. recordNode.InnerText += @"<c>15/08/1955</c>" + Environment.NewLine;
  8. recordNode.InnerText += @"</AA>" + Environment.NewLine;
  9. XmlWriter w = new XmlTextWriter(@"C:\Users\xxx\Documents\XML\news.xml", Encoding.UTF8);
  10. xmlDoc.WriteTo(w);
  11. w.Flush();
  12. w.Close();


 
mais dans le fichier XML j'ai : (j'ai exécuté 2 fois le programme pour montrer que ça ajoute bien à la suite dans mon XML)
 

Code :
  1. <?xml version="1.0" encoding="UTF-8"?><entete>
  2. &lt;AA&gt;
  3. &lt;a&gt;7&lt;/a&gt;
  4. &lt;b&gt;FFFF&lt;/b&gt;
  5. &lt;c&gt;15/08/1955&lt;/c&gt;
  6. &lt;/AA&gt;
  7.  
  8. &lt;AA&gt;
  9. &lt;a&gt;7&lt;/a&gt;
  10. &lt;b&gt;FFFF&lt;/b&gt;
  11. &lt;c&gt;15/08/1955&lt;/c&gt;
  12. &lt;/AA&gt;
  13. </entete>


 
au lieu de m'écrire "<" ou ">", j'ai au contraire "&lt;" et "&gt;" à la place.
 
j'ai beau chercher je n'arrive pas a avoir le bon résultat. pouvez-vous me guider pour solutionner le problème ? Merci !
 
Je travaille avec Visual Studio Community 2015
 
ps : je suis un débutant en C#


Message édité par recep le 25-11-2016 à 10:08:09
mood
Publicité
Posté le 22-11-2016 à 14:38:45  profilanswer
 

n°2292470
Jean-Kevai​n
Posté le 22-11-2016 à 20:04:22  profilanswer
 

Salut,
 
C'est normal, XmlWriter échappe les caractères spéciaux (https://fr.wikipedia.org/wiki/Liste [...] ML_et_HTML) afin de préserver l'intégrité du document.
 
Tu dois utiliser la méthode CreateTextNode : https://msdn.microsoft.com/en-us/li [...] .110).aspx

Message cité 1 fois
Message édité par Jean-Kevain le 22-11-2016 à 20:04:54
n°2292477
recep
Posté le 23-11-2016 à 09:28:55  profilanswer
 

Jean-Kevain a écrit :

Salut,
 
C'est normal, XmlWriter échappe les caractères spéciaux (https://fr.wikipedia.org/wiki/Liste [...] ML_et_HTML) afin de préserver l'intégrité du document.
 
Tu dois utiliser la méthode CreateTextNode : https://msdn.microsoft.com/en-us/li [...] .110).aspx


 
Merci Jean-Kevain.  
 
Je un peu regardé l'exemple de ton lien, ça marche si je veux ajouter un élément avec son contenu par ex. la balise "<test>" avec son élément "Hello" ça fonctionne bien.  
 

Code :
  1. XmlElement test = xmlDoc.CreateElement("test" );
  2. XmlText texttest = xmlDoc.CreateTextNode("11/12/1999" );
  3. xmlDoc.DocumentElement.AppendChild(test);
  4. xmlDoc.DocumentElement.LastChild.AppendChild(texttest);


 
 
Mais par contre si je veux ajouter la dernière balise "<AA>" et ses sous balises <a>10</a><b>DDDD</b><c>11/12/1999</c> quelle méthode dois-je utiliser?
 
 

Code :
  1. <entete>
  2. <AA>
  3.  <a>7</a>
  4.  <b>FFFF</b>
  5.  <c>15/08/1955</c>
  6. </AA>
  7. <AA>
  8.  <a>7</a>
  9.  <b>FFFF</b>
  10.  <c>15/08/1955</c>
  11. </AA>
  12. <test>Hello</test>
  13. <AA>
  14.  <a>10</a>
  15.  <b>DDDD</b>
  16.  <c>11/12/1999</c>
  17. </AA>
  18. <entet>

n°2292478
Jean-Kevai​n
Posté le 23-11-2016 à 10:03:53  profilanswer
 

Tu dois instancier un nouveau XmlNode et l'associer au node père. Pour faire simple, tu dois jouer aux poupées russes avec les différents objets Xml***

 

(Désolé, je suis sur mobile et je ne peux pas te mettre un bout de code.)

n°2292524
TotalRecal​l
Posté le 23-11-2016 à 14:55:57  profilanswer
 

Pour info XmlDocument ça date quand même de .Net 1.1. En d'autres termes ça a 15 ans, on a fait légèrement mieux depuis pour manipuler des XML...


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2292623
recep
Posté le 24-11-2016 à 09:40:42  profilanswer
 

TotalRecall a écrit :

Pour info XmlDocument ça date quand même de .Net 1.1. En d'autres termes ça a 15 ans, on a fait légèrement mieux depuis pour manipuler des XML...


Bonjour TotalRecall,
 
Tu me conseillerais quoi pour manipuler les XML? je ne te demande pas de faire le boulot à ma place... Je débute en programmation c# et pour l'instant j'ai un peu de mal avec les instances/class/etc.
 
merci d'avance..

n°2292625
TotalRecal​l
Posté le 24-11-2016 à 09:46:13  profilanswer
 
n°2292626
recep
Posté le 24-11-2016 à 09:53:40  profilanswer
 
n°2292634
TotalRecal​l
Posté le 24-11-2016 à 10:26:49  profilanswer
 

C'est une possibilité parmi d'autres, mais elle a le mérite d'être supportée en natif et bien plus récente de conception que XmlDocument, la syntaxe est beaucoup plus souple, notamment pour effectuer des requêtes sur un document existant mais aussi pour construire de nouveaux éléments.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2292637
recep
Posté le 24-11-2016 à 10:59:45  profilanswer
 

TotalRecall a écrit :

C'est une possibilité parmi d'autres, mais elle a le mérite d'être supportée en natif et bien plus récente de conception que XmlDocument, la syntaxe est beaucoup plus souple, notamment pour effectuer des requêtes sur un document existant mais aussi pour construire de nouveaux éléments.


Avec ton premier lien j'ai réussi à faire ce que je voulais. Merci !
 
Maintenant il ne me reste plus qu'a rechercher la valeur d'un élément (ici n° ID). Je vais d'abord chercher de mon côté et reviens vers vous si jamais je bloque.
 
Mais d'abord j'ai une petite question.
 
Qu'est-ce qui est plus simple de faire pour rechercher l'ID? c'est rechercher une balise dédiée à ça (<id>ici n°ID</id> ) comme dans mon premier exemple ou alors comme sur le second exemple avec l'ID sur l'élément "news" par exemple ?
 

Code :
  1. </liste>
  2. <news>
  3.  <id>1</id>
  4.  <abc>test</abc>
  5.  <edf>hihi</edf>
  6.  <date>13/05/2016</date>
  7.  <titre>blabla</titre>
  8.  <contenu></contenu>
  9.  <lien>xxx</lien>
  10. </news>
  11. <news>
  12.  <id>2</id>
  13.  <abc>test02</abc>
  14.  <edf>haha</edf>
  15.  <date>10/12/2016</date>
  16.  <titre>blabla2</titre>
  17.  <contenu></contenu>
  18.  <lien>xxx2</lien>
  19. </news>
  20. </liste>


 
seconde méthode :
 

Code :
  1. </liste>
  2. <news id="1">
  3.  <abc>test</abc>
  4.  <edf>hihi</edf>
  5.  <date>13/05/2016</date>
  6.  <titre>blabla</titre>
  7.  <contenu></contenu>
  8.  <lien>xxx</lien>
  9. </news>
  10. <news id="2">
  11.  <abc>test02</abc>
  12.  <edf>haha</edf>
  13.  <date>10/12/2016</date>
  14.  <titre>blabla2</titre>
  15.  <contenu></contenu>
  16.  <lien>xxx2</lien>
  17. </news>
  18. </liste>

mood
Publicité
Posté le 24-11-2016 à 10:59:45  profilanswer
 

n°2292638
TotalRecal​l
Posté le 24-11-2016 à 11:02:45  profilanswer
 

Attribut ou élément c'est exactement pareil en terme de difficulté, ça dépend juste de comment tu as envie de structurer ton xml.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2292639
TotalRecal​l
Posté le 24-11-2016 à 11:06:56  profilanswer
 

Pour tes news tu dois pouvoir écrire un truc comme ça, un exemple à l'arrache (à vérifier) pour chaque cas :

 

Par attribut :
XDocument doc = XDocument.Load("test.xml" );
var resulmt = doc.Descendants("news" ) // ou .Elements("news" ), dépend de la structure, je te laisse regarder les détails
               .Where(t => (string) t.Attribute("id" ) == "2" )
               .FirstOrDefault();

 

Par noeud :
   var result = doc.Elements("news" ).
Where(x => x.Element("id" ).Value == "2" ).FirstOrDefault();

Message cité 1 fois
Message édité par TotalRecall le 24-11-2016 à 11:07:19

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2292703
recep
Posté le 25-11-2016 à 09:58:47  profilanswer
 

TotalRecall a écrit :

Pour tes news tu dois pouvoir écrire un truc comme ça, un exemple à l'arrache (à vérifier) pour chaque cas :
 
Par attribut :
XDocument doc = XDocument.Load("test.xml" );
var resulmt = doc.Descendants("news" ) // ou .Elements("news" ), dépend de la structure, je te laisse regarder les détails
               .Where(t => (string) t.Attribute("id" ) == "2" )
               .FirstOrDefault();
 
Par noeud :
   var result = doc.Elements("news" ).
Where(x => x.Element("id" ).Value == "2" ).FirstOrDefault();


 
Bonjour,
 
voilà j'ai utilisé ce code :

Code :
  1. int lastId = (int)xmlDoc.Descendants("news" ).Last().Attribute("id" );


et ça marche parfaitement.
 
Je vous remercie pour votre aide. à bientôt...

n°2292846
TotalRecal​l
Posté le 28-11-2016 à 09:24:17  profilanswer
 

Ok, j'avais compris ta phrase "Maintenant il ne me reste plus qu'a rechercher la valeur d'un élément (ici n° ID)" dans le sens "rechercher un élément par son id" et non pas "rechercher l'id du dernier élément".  
 
Petites remarques :
- Ton code te renvoie le dernier élément dans la structure du xml, donc si tu veux l'id le plus grand mais que tes éléments ne sont pas dans l'ordre ça va foirer.  
A la place tu pourrais faire qqch comme :  
maxId = (int)xmlDoc.Descendants("news" ).Max(t => int.Parse(t.Attribute("id" ).Value) si tu veux être sûr de prendre le plus grand
- Si ton xml a plusieurs collections "news" utiliser Descendants ne fera pas forcément exactement ce que tu veux, il vaut mieux utiliser Elements() en naviguant explicitement dans le doc


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2292847
recep
Posté le 28-11-2016 à 09:49:56  profilanswer
 

TotalRecall a écrit :

Ok, j'avais compris ta phrase "Maintenant il ne me reste plus qu'a rechercher la valeur d'un élément (ici n° ID)" dans le sens "rechercher un élément par son id" et non pas "rechercher l'id du dernier élément".  
 
Petites remarques :
- Ton code te renvoie le dernier élément dans la structure du xml, donc si tu veux l'id le plus grand mais que tes éléments ne sont pas dans l'ordre ça va foirer.  
A la place tu pourrais faire qqch comme :  
maxId = (int)xmlDoc.Descendants("news" ).Max(t => int.Parse(t.Attribute("id" ).Value) si tu veux être sûr de prendre le plus grand
- Si ton xml a plusieurs collections "news" utiliser Descendants ne fera pas forcément exactement ce que tu veux, il vaut mieux utiliser Elements() en naviguant explicitement dans le doc


 
Ok j'essaierai ta solution. Merci pour l'info !
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [Résolu] Mettre à jour/ajouter éléments dans un XML en C#

 

Sujets relatifs
coment faire tourner un borland C++ sur windoiws10C program from dedicated linux server
[C#/HTML] Formater un email via HTMLSimplifier une ligne de push_back (string) répétitifs
Mise à jour requête OLEDB et TCDDonner des cours pour Les TD et TP en C
[ C ] - Question sur les tableaux de pointeursVerifier l'état de la fenêtre d'un exe en C #
Revenir au CAide sur pointeurs et array en C
Plus de sujets relatifs à : [Résolu] Mettre à jour/ajouter éléments dans un XML en C#


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR