En esta ocasión, nos basaremos en la entrada publicada la semana pasada aquí.
En esta ocasión necesitamos obtener un XML anidado con varios elementos y sus respectivos atributos:
?<?xml version="1.0" encoding="utf-8"?>
<ejemplo>
<padre>
<hijo Atributo1="" otroatributo="soy otro atributo">
<Codigo>0</Codigo>
<Texto />
<Fecha>2017-02-24T14:30:05.2897119-03:00</Fecha>
</hijo>
</padre>
</ejemplo>
Serializar una clase
Aquí recibimos como parámetro un objeto y lo convertimos a XML.
Primeramente, creamos la clase (que se convertirá al formato XML):
using System;
using System.Xml.Serialization;
namespace ConsoleBlog
{
[XmlRoot("ejemplo")]
public class Ejemplo
{
private Padre padre_ = new Padre();
[XmlElement("padre")]
public Padre Padre
{
get
{
return padre_;
}
set
{
padre_ = value;
}
}
}
[XmlType("padre")]
public class Padre
{
private Hijo hijo_ = new Hijo();
[XmlElement("hijo")]
public Hijo Hijo
{
get
{
return hijo_;
}
set
{
hijo_ = value;
}
}
}
[XmlType("hijo")]
public class Hijo
{
private int codigo = 0;
private string nombre = string.Empty;
private DateTime fecha = DateTime.Now;
private string atributo1 = string.Empty;
private string atributo2 = "soy otro atributo";
private string nomeincluyen = ":(";
[XmlElement]
public int Codigo
{
get
{
return codigo;
}
set
{
codigo = value;
}
}
[XmlElement("Texto")]
public string Nombre
{
get
{
return nombre;
}
set
{
nombre = value;
}
}
[XmlElement]
public DateTime Fecha
{
get
{
return fecha;
}
set
{
fecha = value;
}
}
[XmlAttribute]
public string Atributo1
{
get
{
return atributo1;
}
set
{
atributo1 = value;
}
}
[XmlAttribute("otroatributo")]
public string Atributo2
{
get
{
return atributo2;
}
set
{
atributo2 = value;
}
}
[XmlIgnore]
public string Nomeincluyen
{
get
{
return nomeincluyen;
}
set
{
nomeincluyen = value;
}
}
}
}
El método para serializar la clase y convertirlo a XML sería:
public static string SerializarXML()
{
//XML a ser retornado
string resultado = string.Empty;
//Variables para definición de XML
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
XmlSerializer serializer = new XmlSerializer(typeof(Ejemplo));
Ejemplo ejemplo = new Ejemplo();
Encoding encoding = Encoding.GetEncoding("UTF-8");
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
{
Indent = true,
OmitXmlDeclaration = false,
Encoding = encoding
};
//Agregar un espacio de nombres vacío
ns.Add("", "");
//Se utiliza using para que el objeto sea eliminado luego de su uso
using (var stream = new MemoryStream())
{
//Creamos un XML
using (var xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
{
//Convertimos la clase en XML
serializer.Serialize(xmlWriter, ejemplo, ns);
}
//Asignamos el XML creado a nuestra variable
resultado = encoding.GetString(stream.ToArray());
}
return resultado;
}
Luego realizamos la llamada y retornamos el XML:
static void Main(string[] args)
{
string xml = Program.SerializarXML();
Console.WriteLine(xml);
Console.ReadKey();
}
Para deserializar se utiliza el mismo método utilizado en el artículo anterior.