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

Mettre à jour/ajouter éléments dans un XML en C# [Résolu] - C#/.NET managed - Programmation

Marsh Posté le 22-11-2016 à 14:38:45    

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
Reply

Marsh Posté le 22-11-2016 à 14:38:45   

Reply

Marsh Posté le 22-11-2016 à 20:04:22    

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
Reply

Marsh Posté le 23-11-2016 à 09:28:55    

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>

Reply

Marsh Posté le 23-11-2016 à 10:03:53    

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.)

Reply

Marsh Posté le 23-11-2016 à 14:55:57    

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
Reply

Marsh Posté le 24-11-2016 à 09:40:42    

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..

Reply

Marsh Posté le 24-11-2016 à 09:46:13    

Reply

Marsh Posté le 24-11-2016 à 09:53:40    

Reply

Marsh Posté le 24-11-2016 à 10:26:49    

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
Reply

Marsh Posté le 24-11-2016 à 10:59:45    

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>

Reply

Marsh Posté le 24-11-2016 à 10:59:45   

Reply

Marsh Posté le 24-11-2016 à 11:02:45    

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
Reply

Marsh Posté le 24-11-2016 à 11:06:56    

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
Reply

Marsh Posté le 25-11-2016 à 09:58:47    

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...

Reply

Marsh Posté le 28-11-2016 à 09:24:17    

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
Reply

Marsh Posté le 28-11-2016 à 09:49:56    

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 !
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed