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.

Menú Edit de Visual Studio con el submenú Paste Special desplegado y Paste XML As Classes seleccionado

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.