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 Special
de Visual Studio pour désérialiser l’objetXml
enC#
-
Utilisez l’outil
XSD
pour désérialiser leXML
en 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
classes
et desobjets
ainsi qu’à desattributs
et desméthodes
. - Les
Objets
sont représentés par des classes par programmation, telles queJohn
ouJames
. - Les
attributs
sont des caractéristiques d’objets telles que lacouleur d'une voiture
,l'année de production
,l'âge d'une personne
oula couleur d'un bâtiment
. XML
est le format normalisé qui permet d’analyser les donnéesXML
quel 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
XML
doit ê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
Modifier
dans la barre de menu de l’IDE. - Sélectionnez
Paste Special
dans 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 Prompt
dans la barre de recherche et cliquez dessus pour l’ouvrir. - Tapez
cd C:\X
pour 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.XML
pour créer unfichier XSD
équivalent à partir du test.XML. - Un fichier
test.XSD
est créé dans le même chemin de fichier. - Tapez
XSD /c test.XSD
pour créer lesclasses C#
équivalentes au fichierXML
. - Un fichier
test.cs
est 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;
}
}
}