Désérialiser XML en objet en C#
- 
          
            Utiliser des classes typées manuellement pour désérialiser le fichier XML en objet C#
- 
          
            Utilisez la fonction Paste Specialde Visual Studio pour désérialiser l’objetXmlenC#
- 
          
            Utilisez l’outil XSDpour désérialiser leXMLen objetC#
 
Cet article va démontrer la conversion ou la désérialisation des fichiers XML dans l’objet C#.
Utiliser des classes typées manuellement pour désérialiser le fichier XML en objet C#
    
- C# est associé à des classeset desobjetsainsi qu’à desattributset desméthodes.
- Les Objetssont représentés par des classes par programmation, telles queJohnouJames.
- Les attributssont des caractéristiques d’objets telles que lacouleur d'une voiture,l'année de production,l'âge d'une personneoula couleur d'un bâtiment.
- XMLest le format normalisé qui permet d’analyser les données- XMLquel que soit le support de transmission du fichier- XML.
Une discussion plus approfondie est disponible via cette référence.
Vous trouverez ci-dessous un exemple de code XML qui serait converti en un objet C#.
1. <?xml version="1.0" encoding="utf-8"?>
2. <Company xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
3.  <Employee name="x" age="30" />
4.  <Employee name="y" age="32" />
5. </Company>
Une classe avec une structure similaire serait créée en C# pour convertir l’exemple de code XML.
using System.Xml.Serialization;
[XmlRoot(ElementName = "Company")]
public class Company
{
  public Company() {
    Employees = new List<Employee>();
  }
  [XmlElement(ElementName = "Employee")]
  public List<Employee> Employees { get; set; }
  public Employee this[string name] {
    get {
      return Employees.FirstOrDefault(
          s => string.Equals(s.Name, name, StringComparison.OrdinalIgnoreCase));
    }
  }
}
public class Employee {
  [XmlAttribute("name")]
  public string Name { get; set; }
  [XmlAttribute("age")]
  public string Age { get; set; }
}
La dernière étape pour convertir l’objet XML en C# consiste à utiliser la fonction System.Xml.Serialization.XmlSerializer pour sérialiser l’objet.
public T DeserializeToObject<T>(string filepath)
    where T : class {
  System.Xml.Serialization.XmlSerializer ser =
      new System.Xml.Serialization.XmlSerializer(typeof(T));
  using (StreamReader sr = new StreamReader(filepath)) {
    return (T)ser.Deserialize(sr);
  }
}
Utilisez la fonction Paste Special de Visual Studio pour désérialiser l’objet Xml en C#
Cette méthode nécessite l’utilisation de Microsoft Visual Studio 2012 et supérieur avec .Net Framework 4.5 et supérieur. La charge de travail WCF pour Visual Studio doit également être installée.
- Le contenu du document XMLdoit être copié dans le presse-papiers.
- Ajouter une nouvelle classe emptyà la solution du projet.
- Ouvrez le nouveau fichier de classe.
- Cliquez sur le bouton Modifierdans la barre de menu de l’IDE.
- Sélectionnez Paste Specialdans la liste déroulante.
- Cliquez sur Coller XML comme classes.

Pour utiliser la classe générée par Visual Studio, créez la classe Helpers.
using System;
using System.IO;
using System.Web.Script.Serialization;  // Add reference: System.Web.Extensions
using System.Xml;
using System.Xml.Serialization;
namespace Helpers {
  internal static class ParseHelpers
  {
    private static JavaScriptSerializer json;
    private static JavaScriptSerializer JSON {
      get { return json ?? (json = new JavaScriptSerializer()); }
    }
    public static Stream ToStream(this string @this) {
      var stream = new MemoryStream();
      var writer = new StreamWriter(stream);
      writer.Write(@this);
      writer.Flush();
      stream.Position = 0;
      return stream;
    }
    public static T ParseXML<T>(this string @this)
        where T : class {
      var reader = XmlReader.Create(
          @this.Trim().ToStream(),
          new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
      return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
    }
    public static T ParseJSON<T>(this string @this)
        where T : class {
      return JSON.Deserialize<T>(@this.Trim());
    }
  }
}
Utilisez l’outil XSD pour désérialiser le XML en objet C#
XSD est utilisé pour générer automatiquement des classes ou des objets équivalents au schéma défini dans un fichier ou un document XML.
XSD.exe se trouve normalement dans le chemin : C:\Program Files (x86)\Microsoft SDKs\Windows\{version}\bin\NETFX {version} Tools\. Une discussion plus approfondie est disponible via cette référence.
Supposons que le fichier XML est enregistré dans ce chemin : C:\X\test.XML.
Voici les étapes à suivre pour désérialiser automatiquement les classes XML vers C# :
- Tapez Developer Command Promptdans la barre de recherche et cliquez dessus pour l’ouvrir.
- Tapez cd C:\Xpour accéder au chemin du fichierXML.
- Supprimez les numéros de ligne et tous les caractères inutiles dans le fichier XML.
- Tapez xsd test.XMLpour créer unfichier XSDéquivalent à partir du test.XML.
- Un fichier test.XSDest créé dans le même chemin de fichier.
- Tapez XSD /c test.XSDpour créer lesclasses C#équivalentes au fichierXML.
- Un fichier test.csest créé, une classe C# avec un schéma exact du fichierXML.
Production:
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System.Xml.Serialization;
//
// This source code was auto-generated by xsd, Version=4.8.3928.0.
//
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Company {
    private CompanyEmployee[] itemsField;
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Employee", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public CompanyEmployee[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class CompanyEmployee {
    private string nameField;
    private string ageField;
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string age {
        get {
            return this.ageField;
        }
        set {
            this.ageField = value;
        }
    }
}
