Archivo XML en VB Net (Serialize)
Publicado: Vie Sep 07, 2012 3:19 am
De recién que empezé a "indagar" en lo de las Facturas Electrónicas, me pasé mucho tiempo tratando de Crear el XML Válido, desafortunadamente aún no teníia la suficiente experiencia y no comprendía muchos términos del Lenguaje VB Net, crear un XML Válido fué para mi toda una proesa, no fué el mejor método ni el mas limpio pero funcionó, después volví a hecharle un vistazo a una técnica que al principio no comprendí bien, la "Serialización" (Serialize), y una vez que lo comprendí, me dí cuenta que a mi parecer es la mejor opción y la más fácil. Solo tienes que conseguir el XSD del CFD o del CFDI, en estos links los encuentras:
CFD v2.2 http://www.sat.gob.mx/cfd/2/cfdv22.xsd
CFD v3.2 http://www.sat.gob.mx/cfd/3/cfdv32.xsd
Ahora ve a Inicio-->Todos los Programas-->Microsoft Visual Studio-->Visual Studio Tools y dentro de esta carpeta esta el Archivo "Developer Command Prompt for VS2012" (es una ventana de cmd) ejecutalo, ve a la Carpeta donde bajaste los XSD (cd RutaCompletaDeCarpeta) y estando ahi, escribe lo siguiente:
Para Visual Basic
xsd cfdv22.xsd /classes /language:vb
Para C#
xsd cfdv22.xsd /classes /language:cs
Se creará 1 Archivo tipo vb o cs, crea un nuevo proyecto y agrégalo, no lo verás en Solution Explorer a menos que tengas activado Show All Files, pero está un nivel abajo del cfdv22.xsd, es la Classe Comprobante con todas las SubClasses, Propiedades, etc que necesitarás para crear el XML.
Agrega una nueva Classe:
En el evento donde quieras crear el XML crea una instancia de Comprobante y llénala con los Datos necesarios, el ejemplo es un Proyecto WinForrms y agregué un WebBrowser para ver el XML Creado:
Listo, XML creado, faltaría agregar el Sello Digital y el Certificado, por ahora les dejo una función para Obtener la Cadena Original:
Después incluyo como Crear el Sello Digital y cómo agregar éste y el Certificado al XML ya creado.
Saludos
CFD v2.2 http://www.sat.gob.mx/cfd/2/cfdv22.xsd
CFD v3.2 http://www.sat.gob.mx/cfd/3/cfdv32.xsd
Ahora ve a Inicio-->Todos los Programas-->Microsoft Visual Studio-->Visual Studio Tools y dentro de esta carpeta esta el Archivo "Developer Command Prompt for VS2012" (es una ventana de cmd) ejecutalo, ve a la Carpeta donde bajaste los XSD (cd RutaCompletaDeCarpeta) y estando ahi, escribe lo siguiente:
Para Visual Basic
xsd cfdv22.xsd /classes /language:vb
Para C#
xsd cfdv22.xsd /classes /language:cs
Se creará 1 Archivo tipo vb o cs, crea un nuevo proyecto y agrégalo, no lo verás en Solution Explorer a menos que tengas activado Show All Files, pero está un nivel abajo del cfdv22.xsd, es la Classe Comprobante con todas las SubClasses, Propiedades, etc que necesitarás para crear el XML.
Agrega una nueva Classe:
Código: Seleccionar todo
Imports System.Text
Public Class clsCFD
Public Shared Sub CreaXML(ByVal Comp As Comprobante, _
Optional ByVal xmlFile As String = "", _
Optional ByVal Guardar As Boolean = True)
Dim serializer As New Xml.Serialization.XmlSerializer(GetType(Comprobante))
Dim ws As New IO.StreamWriter(xmlFile, False, New UTF8Encoding)
serializer.Serialize(ws, Comp)
ws.Flush()
ws.Close()
ws.Dispose()
serializer = Nothing
End Sub
End Class
Código: Seleccionar todo
Dim xmlFile As String = IO.Path.Combine(Application.StartupPath, "CFDv22 " & Today.ToString("yyyy-MMM-dd ss") & ".xml")
Sub CreaXmlCFD()
Dim cfd As New Comprobante
With cfd
.version = "2.2"
.anoAprobacion = "2012"
.noAprobacion = "10020020202102"
.fecha = Now.ToString("s")
.folio = "1"
.metodoDePago = "TRANSFERENCIA"
.NumCtaPago = "6722"
.noCertificado = "01234567890123456789"
.tipoDeComprobante = ComprobanteTipoDeComprobante.ingreso
.Emisor = New ComprobanteEmisor With _
{.nombre = "NOMBRE EMISOR",
.rfc = "RFCEMISOR",
.DomicilioFiscal = New t_UbicacionFiscal With _
{.calle = "Calle",
.noExterior = "123",
.codigoPostal = "44150",
.municipio = "GUADALAJARA"}}
.Receptor = New ComprobanteReceptor With _
{.nombre = "NOMBRE EMISOR",
.rfc = "RFCEMISOR",
.Domicilio = New t_Ubicacion With _
{.calle = "Calle",
.noExterior = "123",
.codigoPostal = "44150",
.municipio = "GUADALAJARA"}}
.Conceptos = {New ComprobanteConcepto With _
{.cantidad = 3,
.unidad = "PZA",
.descripcion = "PRODUCTO 1",
.valorUnitario = 150,
.importe = CDec(CDbl(.cantidad * .valorUnitario))}}
.Impuestos = New ComprobanteImpuestos With _
{.Traslados = {New ComprobanteImpuestosTraslado With _
{.impuesto = ComprobanteImpuestosTrasladoImpuesto.IVA,
.tasa = 16,
.importe = CDec(cfd.Conceptos.Sum(Function(con) con.importe)) * CDec("." & .tasa)}}}
.subTotal = CDec(cfd.Conceptos.Sum(Function(con) con.importe))
.total = CDec(.subTotal * 1.16)
End With
clsCFD.CreaXML(cfd, xmlFile)
WebBrowser1.Navigate(xmlFile)
End Sub
Código: Seleccionar todo
Public Shared Function GetCadenaOriginal(ByVal xmlDoc As String, ByVal fileXSLT As String) As String
Dim strCadenaOriginal As String
Dim newFile = Path.GetTempFileName()
Dim Xsl = New Xml.Xsl.XslCompiledTransform()
Xsl.Load(fileXSLT)
Xsl.Transform(xmlDoc, newFile)
Xsl = Nothing
Dim sr = New IO.StreamReader(newFile)
strCadenaOriginal = sr.ReadToEnd
sr.Close()
'Eliminamos el archivo Temporal
System.IO.File.Delete(newFile)
fileXSLT = Nothing
newFile = Nothing
Xsl = Nothing
sr.Dispose()
Return strCadenaOriginal
End Function
Saludos