Generar clase C# desde XSD con línea de comandos de Visual Studio

xsd y c#

En este tutorial te muestro como generar una clase de C Sharp desde un archivo XSD y para que sirve...

Muchas de las veces como programador he tenido la necesidad de crear sistemas que se conectan a servicios externos mediante servicios web y mediante estos servicios web es necesario pasar un XML; por ejemplo: facturación electronica, certificación electrónica y titulación electrónica aquí en mi país (México).

Ahora, tu te preguntaras que tiene que ver el envió de XML mediante un servicio web respecto al titulo del articulo.

Te explico:

Mediante el servicio web se envía un XML, pero ese XML la mayoría de las veces lo tenemos que construir via programación mediante librerías un poco tediosas y no abarcamos todas las reglas que cada uno de los campos debe contener; como longitud, tipo de dato, entre otros.

Ahora un XSD es un mecanismo para comprobar la validez de un documento XML, es decir, definir su estructura: qué elementos, qué tipos de datos, que atributos, en qué orden, cuántas veces se repiten, etc.

Entonces cuando nosotros convertimos un XSD a una clase de cSharp, tenemos objetos, propiedades que se pueden llenar fácilmente via programación y posteriormente serializar el objeto para obtener un XML autentico.

Vamos hacer el Ejemplo:

El siguiente XSD es el clásico "Hola Mundo" y yo lo tengo guardado en "c:\HolaMundo.xsd"

Sí analizamos un poco el XSD nos damos cuenta que solo tiene una propiedad llamada Mensaje, en la cual le asignamos un valor tipo string.

<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="HolaMundo"> <xsd:complexType> <xsd:attribute name="Mensaje" type="xsd:string" use="required">
</xsd:attribute>
</xsd:complexType> </xsd:element> </xsd:schema>

1. Vamos al menu inicio de nuestra computadora y buscamos develop command prompt for vsXXXX (en mi caso mi visual studio es 2017)


2.- Vamos a la carpeta que tiene el archivo xsd usando el comando "cd" en este ejemplo la ruta es la raíz.

cd c:\



3.- Usamos el siguiente comando para generar un archivo de clase c# cambiando las palabras en rojo de acuerdo a tu archivo y tu nombre de espacio.


xsd /c /namespace:SolucionesDC /language:CS HolaMundo.xsd


4.- Abrimos la ruta donde tenemos guardado el XSD y vemos que hay un archivo con el nombre HolaMundo.cs

namespace SolucionesDC { using System.Xml.Serialization; [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.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 HolaMundo { private string mensajeField; [System.Xml.Serialization.XmlAttributeAttribute()] public string Mensaje { get { return this.mensajeField; } set { this.mensajeField = value; } } } }

Listo, hemos generado una clase a partir de un XML y podemos hacer uso de esta clase como un objeto.

Posteriormente agregamos un par de lineas más para pode serializar y deserializar y queda de la siguiente forma:

namespace SolucionesDC { using System.Xml.Serialization; [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.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 HolaMundo { private string mensajeField; private static System.Xml.Serialization.XmlSerializer serializer; [System.Xml.Serialization.XmlAttributeAttribute()] public string Mensaje { get { return this.mensajeField; } set { this.mensajeField = value; } } private static System.Xml.Serialization.XmlSerializer Serializer { get { if ((serializer == null)) { serializer = new System.Xml.Serialization.XmlSerializer(typeof(HolaMundo)); } return serializer; } } #region Serialize/Deserialize public virtual string Serialize(System.Text.Encoding encoding) { System.IO.StreamReader streamReader = null; System.IO.MemoryStream memoryStream = null; try { memoryStream = new System.IO.MemoryStream(); System.Xml.XmlWriterSettings xmlWriterSettings = new System.Xml.XmlWriterSettings(); xmlWriterSettings.Encoding = encoding; System.Xml.XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings); Serializer.Serialize(xmlWriter, this); memoryStream.Seek(0, System.IO.SeekOrigin.Begin); streamReader = new System.IO.StreamReader(memoryStream); return streamReader.ReadToEnd(); } finally { if ((streamReader != null)) { streamReader.Dispose(); } if ((memoryStream != null)) { memoryStream.Dispose(); } } } public virtual string Serialize() { return Serialize(Encoding.UTF8); } public static bool Deserialize(string xml, out HolaMundo obj, out System.Exception exception) { exception = null; obj = default(HolaMundo); try { obj = Deserialize(xml); return true; } catch (System.Exception ex) { exception = ex; return false; } } public static bool Deserialize(string xml, out HolaMundo obj) { System.Exception exception = null; return Deserialize(xml, out obj, out exception); } public static HolaMundo Deserialize(string xml) { System.IO.StringReader stringReader = null; try { stringReader = new System.IO.StringReader(xml); return ((HolaMundo)(Serializer.Deserialize(System.Xml.XmlReader.Create(stringReader)))); } finally { if ((stringReader != null)) { stringReader.Dispose(); } } } public virtual bool SaveToFile(string fileName, System.Text.Encoding encoding, out System.Exception exception) { exception = null; try { SaveToFile(fileName, encoding); return true; } catch (System.Exception e) { exception = e; return false; } } public virtual bool SaveToFile(string fileName, out System.Exception exception) { return SaveToFile(fileName, Encoding.UTF8, out exception); } public virtual void SaveToFile(string fileName) { SaveToFile(fileName, Encoding.UTF8); } public virtual void SaveToFile(string fileName, System.Text.Encoding encoding) { System.IO.StreamWriter streamWriter = null; try { string xmlString = Serialize(encoding); streamWriter = new System.IO.StreamWriter(fileName, false, Encoding.UTF8); streamWriter.WriteLine(xmlString); streamWriter.Close(); } finally { if ((streamWriter != null)) { streamWriter.Dispose(); } } } public static bool LoadFromFile(string fileName, System.Text.Encoding encoding, out HolaMundo obj, out System.Exception exception) { exception = null; obj = default(HolaMundo); try { obj = LoadFromFile(fileName, encoding); return true; } catch (System.Exception ex) { exception = ex; return false; } } public static bool LoadFromFile(string fileName, out HolaMundo obj, out System.Exception exception) { return LoadFromFile(fileName, Encoding.UTF8, out obj, out exception); } public static bool LoadFromFile(string fileName, out HolaMundo obj) { System.Exception exception = null; return LoadFromFile(fileName, out obj, out exception); } public static HolaMundo LoadFromFile(string fileName) { return LoadFromFile(fileName, Encoding.UTF8); } public static HolaMundo LoadFromFile(string fileName, System.Text.Encoding encoding) { System.IO.FileStream file = null; System.IO.StreamReader sr = null; try { file = new System.IO.FileStream(fileName, FileMode.Open, FileAccess.Read); sr = new System.IO.StreamReader(file, encoding); string xmlString = sr.ReadToEnd(); sr.Close(); file.Close(); return Deserialize(xmlString); } finally { if ((file != null)) { file.Dispose(); } if ((sr != null)) { sr.Dispose(); } } } #endregion } }


Espero te haya sido de utilidad y no olvide compartir.




Artículo Anterior Artículo Siguiente

Ad Blocker

¡Hola! Para mantener nuestro sitio gratuito, necesitamos mostrar anuncios. Por favor, considera desactivar tu bloqueador de anuncios para apoyarnos.