Cita:
Iniciado por J_L_A BenuR, hay una manera más fácil para generar el xml.
-Convertir cfdv2.xsd (está en la página del SAT) a clase de c# desde la linea de comandos ms-dos:
(Devuelve cfdv2.cs)
-Integrarlo al proyecto como módulo de clase, por ejemplo con el nombre Comprobante.cs
-Ahora se declara una variable de tipo Comprobante
Código:
Comprobante comprobante = new Comprobante();
-Se le asignan valores:
Código:
comprobante.version = "2.0";
comprobante.serie = "ABCD";
.
.
.
... y así con cada clase (emisor, receptor, conceptos, impuestos, etc.) del módulo Comprobante.cs:
Código:
ComprobanteEmisor comprobanteEmisor = new ComprobanteEmisor();
comprobanteEmisor.nombre = "Juan Pérez";
comprobanteEmisor.rfc = "ABCD0102039Z0";
.
.
.
-Después se genera el xml con:
Código:
using System.xml;
using System.Xml.Serialization;
using System.Text.Encoding;
XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
XmlTextWriter xmlTextWriter = new XmlTextWriter(RutaConNombreArchivoSinExtension + ".xml", Encoding.UTF8);
xmlTextWriter.Formatting = Formatting.Indented;
XmlSerializer xs = new XmlSerializer(typeof(Comprobante));
xs.Serialize(xmlTextWriter, comprobante, xmlNameSpace);
xmlTextWriter.Close();
Será necesario generar el xml dos veces: la segunda para insertarle el sello digital. Si quieren mas adelante los digo como se hace.
Espero sirva. A la orden para dudas, correcciones u objeciones.
Saludos!
Hola Qué tal a todos, muchas gracias por las contribuciones de todos. Quisiera despejar una duda en cuanto a la construcción del XML, ya que me atoré en la parte de conceptos, tengo el siguiente código, el cual funciona a la perfección hasta la parte de conceptos que es donde me manda el sig mensaje: "Referencia a objeto no establecida como instancia de un objeto". '¿¿Alguien me podría decir por que pasa esto??, ¿Necesito un constructor??
private void crearCFD_Click(object sender, EventArgs e)
{
Comprobante comprobante = new Comprobante();
ComprobanteEmisor comprobanteEmisor = new ComprobanteEmisor();
t_UbicacionFiscal ubicacionEmisor = new t_UbicacionFiscal();
ComprobanteReceptor comprobanteReceptor = new ComprobanteReceptor();
t_Ubicacion ubicacionReceptor = new t_Ubicacion();
ComprobanteConcepto[] comprobanteConcepto = new ComprobanteConcepto[10];
comprobante.version = "2.0";
comprobante.serie = "ABCD";
comprobante.folio = "12345";
comprobante.fecha = Convert.ToDateTime("2010-05-03T14:11:36");
comprobante.noCertificado = "20001000000100000377";
comprobante.subTotal = 2000.00M;
comprobante.total = 2320.00M;
comprobante.noAprobacion = "49";
comprobante.anoAprobacion = "2010";
comprobante.formaDePago = "PAGO EN UNA SOLA EXHIBICIÓN";
comprobante.descuento = 0.00M;
comprobante.metodoDePago = "EFECTIVO";
comprobanteEmisor.nombre = "CONTRIBUYENTE PRUEBASEIS PATERNOSEIS MATERNOSEIS";
comprobanteEmisor.rfc = "PAMC660606ER9";
ubicacionEmisor.calle = "PRUEBA SEIS";
ubicacionEmisor.noExterior = "6";
ubicacionEmisor.noInterior = "6";
ubicacionEmisor.colonia = "PUEBLA CENTRO";
ubicacionEmisor.localidad = "PUEBLA";
ubicacionEmisor.municipio = "PUEBLA";
ubicacionEmisor.estado = "PUEBLA";
ubicacionEmisor.pais = "MÉXICO";
ubicacionEmisor.codigoPostal = "72000";
comprobanteReceptor.nombre = "ROSA MARÍA CALDERÓN UIRIEGAS";
comprobanteReceptor.rfc = "CAUR390312S87";
ubicacionReceptor.calle = "TOPOCHICO";
ubicacionReceptor.noExterior = "52";
ubicacionReceptor.colonia = "JARDINES DEL VALLE";
ubicacionReceptor.estado = "NUEVO LEON";
ubicacionReceptor.pais = "México";
ubicacionReceptor.codigoPostal = "95465";
comprobanteConcepto[0].unidad = "Servicio";
comprobanteConcepto[0].noIdentificacion = "01";
comprobanteConcepto[0].descripcion = "Asesoria Fiscal y administrativa";
comprobanteConcepto[0].valorUnitario = 2000.00M;
comprobanteConcepto[0].importe = 2000.00M;
comprobanteEmisor.DomicilioFiscal = ubicacionEmisor;
comprobante.Emisor = comprobanteEmisor;
comprobanteReceptor.Domicilio = ubicacionReceptor;
comprobante.Receptor = comprobanteReceptor;
comprobante.Conceptos = comprobanteConcepto;
XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("schemaLocation", "http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd");
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
XmlTextWriter xmlTextWriter = new XmlTextWriter("C:\\Users\\BJK1\\Desktop\\archivo" + ".xml", Encoding.UTF8);
xmlTextWriter.Formatting = Formatting.Indented;
XmlSerializer xs = new XmlSerializer(typeof(Comprobante));
xs.Serialize(xmlTextWriter, comprobante, xmlNameSpace);
xmlTextWriter.Close();
}