<?xml version="1.0" encoding="utf-8" ?> - <ListeDeContacts> - <Contact> <Nom>Di</Nom> <Prenom>Alain</Prenom> <Naissance>01/02/1900</Naissance> </Contact> - <Contact> <Nom>Sor</Nom> <Prenom>Jean</Prenom> <Naissance>01/01/1900</Naissance> </Contact> - <Contact> <Nom>Zétofrai</Nom> <Prenom>Mélanie</Prenom> <Naissance>01/03/1900</Naissance> </Contact> </ListeDeContacts>
using System; namespace test { public class Contact { public string Nom { get; set; } public string Prenom { get; set; } public DateTime Naissance { get; set; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Xml.Linq; namespace test { public static class AccesXML { /// <summary> /// Méthode pour lire le xml /// </summary> /// <param name="fichier">chemin du fichier</param> /// <returns>une liste de contacts</returns> public static List<Contact> LireContacts(string fichier) { XDocument xDoc = XDocument.Load(fichier); List<Contact> contacts;// on peux éviter cette ligne mais je décompose pour l'exemple contacts = (from c in xDoc.Descendants("Contact")//dans xDoc, on passe en revue chaque occurence de "Contact" select new Contact//crée une nouvelle instance de ma classe Contact { Nom = c.Element("Nom").Value, Prenom = c.Element("Prenom").Value, Naissance = Convert.ToDateTime(c.Element("Naissance").Value) } ).ToList<Contact>();//cast le resultat de la requette du type Iennumerable<Contact> en List<Contact> return contacts; } /// <summary> /// Méthode qui ecrit le xml /// </summary> /// <param name="Contacts">La liste de contacts</param> /// <param name="fichier">chemin du fichier</param> public static void EcritContacts(List<Contact> Contacts, string fichier) { XDocument xDoc = new XDocument( new XElement("ListeDeContacts", //une balise from c in Contacts orderby c.Prenom ascending //triés par prénom pour le principe select new XElement("Contact", new XElement("Nom", c.Nom),//on écrit l'élement Nom new XElement("Prenom", c.Prenom),//on écrit l'élement Prénom new XElement("Naissance", c.Naissance.ToShortDateString())// on écrit l'élément date de naissance ))); xDoc.Save(fichier); } } }
using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms; namespace test { public partial class Form4 : Form { List<Contact> contacts; public Form4() { InitializeComponent(); } private void Form4_Load(object sender, EventArgs e) { AfficheContact(); } /// <summary> /// affiche le fichier xml dans le datagridview /// </summary> private void AfficheContact() { if (File.Exists("Contacts.xml")) contacts = AccesXML.LireContacts("Contacts.xml");//charge le fichier s'il existe //on voit ici l'interet que AccesSML soit une classe statique: //il n'y a pas besoin d'instancier une variable pour utiliser la méthode else contacts = new List<Contact>();//sinon initialise une liste vide contactBindingSource.DataSource = contacts;//binde la liste de contacts } /// <summary> /// enregistre le xml dès qu'une entrée est validée dans le datagridview /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void contactBindingSource_CurrentItemChanged(object sender, EventArgs e) { if (contacts.Count > 0) AccesXML.EcritContacts(contacts, "Contacts.xml"); //on voit ici l'interet que AccesSML soit une classe statique: //il n'y a pas besoin d'instancier une variable pour utiliser la méthode else File.Delete("Contacts.xml"); } } }