HOWTO · Csharp
Deserializar XML a objeto en C#
En este tutorial, aprenda los diferentes métodos para deserializar un objeto xml a C# con ejemplos. Utilice la característica especial de pegado de Visual Studio, la herramienta xsd y escriba la clase equivalente en C#.
En esta página
Para deserializar XML en un objeto C#, define una clase cuyos miembros coincidan con el documento y usa XmlSerializer. Puedes escribir la clase, generarla a partir de un ejemplo de XML con Visual Studio Paste Special o generarla a partir de un esquema de XML con la herramienta XSD. La generación de clases crea un tipo; la deserialización es el paso independiente que lee XML en una instancia de ese tipo.
Usa clases escritas manualmente para deserializar XML en un objeto C#
En un documento XML como <Company><Employee name="Ana" age="30" /></Company>, el elemento raíz corresponde al tipo Company, los elementos Employee repetidos corresponden a una colección y los atributos name y age corresponden a propiedades marcadas con XmlAttribute. Haz coincidir los nombres de los elementos y atributos, y ten en cuenta los espacios de nombres cuando el documento los utilice; XmlSerializer usa estas correspondencias para leer el documento y crear el grafo de objetos.
Ejecuta este ejemplo completo. El código y la salida se conservan byte por byte en inglés; la salida indica que hay dos empleados y muestra el nombre y la edad del primero:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
public class Company
{
[XmlElement("Employee")]
public List<Employee> Employees { get; set; } = new List<Employee>();
}
public class Employee
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("age")]
public int Age { get; set; }
}
public class Program
{
public static void Main()
{
const string xml = "<Company><Employee name=\"Ana\" age=\"30\" /><Employee name=\"Bo\" age=\"32\" /></Company>";
var serializer = new XmlSerializer(typeof(Company));
using (var reader = new StringReader(xml))
{
var company = (Company)serializer.Deserialize(reader);
Console.WriteLine($"Employees: {company.Employees.Count}; first: {company.Employees[0].Name}, {company.Employees[0].Age}");
}
}
}
Employees: 2; first: Ana, 30
En una aplicación que lee un archivo, pasa a Deserialize un StreamReader de ese archivo en lugar del StringReader. XmlSerializer.Deserialize devuelve un object; conviértelo al tipo raíz que espera el serializador, como hace este ejemplo con Company. La deserialización lee XML en un objeto; la serialización realiza la operación inversa y escribe un objeto como XML. Si un valor o el nombre de un elemento no coincide con la correspondencia definida en la clase, ajusta el tipo o sus atributos de serialización para que reflejen el documento.
Usa Visual Studio Paste Special para generar clases C# a partir de XML
Paste Special puede crear un modelo inicial de clases a partir de un ejemplo representativo de XML. Copia el documento XML, abre o crea un archivo C# en Visual Studio y selecciona Edit > Paste Special > Paste XML As Classes. La captura muestra el comando en el submenú Paste Special del menú Edit.
La captura muestra Paste XML As Classes en el menú desplegado Edit > Paste Special.
Usa las clases generadas como tipos de destino para XmlSerializer; el comando del menú no lee un documento y lo convierte en un objeto. Comprueba que los nombres de los miembros y los atributos generados coincidan con el XML real, sobre todo si los documentos contienen espacios de nombres, campos opcionales o elementos repetidos. La forma exacta de las clases generadas puede depender del ejemplo, así que considéralas un borrador y conserva en el proyecto los ajustes necesarios. Si el elemento de menú no está disponible en tu entorno, usa la correspondencia manual anterior o el flujo con esquemas que se explica a continuación; este artículo no presupone una versión ni una carga de trabajo específica de Visual Studio.
Usa la herramienta XSD para generar clases C# a partir de XML
El flujo de XSD consta de dos conversiones distintas: primero se genera un esquema de XML a partir de un documento representativo de XML y, después, se generan clases C# a partir de ese esquema. Con los archivos en un directorio de trabajo, la secuencia de comandos es xsd test.xml seguida de xsd /c test.xsd. El primer comando escribe un archivo de esquema y el segundo solicita generar clases C# a partir de ese esquema. Estos comandos ilustran las entradas y el orden de la herramienta; su disponibilidad y forma de invocarla pueden variar según el entorno de desarrollo instalado, así que consulta la documentación de la herramienta XSD correspondiente a ese entorno en lugar de dar por sentada una ruta de instalación.
Los nombres de las clases y sus miembros generados pueden diferir de los que escribirías manualmente, pero los metadatos de correspondencia de XML permiten que XmlSerializer identifique los elementos y atributos del documento. Después de generar las clases, haz referencia a ellas en la aplicación y deserializa el documento XML en el tipo raíz generado siguiendo el mismo patrón de XmlSerializer que se muestra arriba. Generar un esquema o un archivo de código fuente no crea por sí solo un objeto con datos. Elige clases manuales para un formato pequeño y estable, Paste Special si trabajas con un ejemplo de XML en el IDE, o el flujo con esquemas si XSD forma parte del proceso o debe servir de base para los tipos generados.