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éesXMLquel que soit le support de transmission du fichierXML.
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;
}
}
}
