Foros del Web » Programación » .NET »

Crear XML para factura electronica

Estas en el tema de Crear XML para factura electronica en el foro de .NET en Foros del Web. Tengo algo de problemas para crear el archivo .xml desde 0 con xmlDocument, por eso abro este tema. Estaba creando el archivo xml con xmltextwriter ...
  #1 (permalink)  
Antiguo 09/12/2010, 18:50
 
Fecha de Ingreso: junio-2010
Mensajes: 23
Antigüedad: 4 años, 2 meses
Puntos: 1
Crear XML para factura electronica

Tengo algo de problemas para crear el archivo .xml desde 0 con xmlDocument,
por eso abro este tema.

Estaba creando el archivo xml con xmltextwriter de forma que se crea y guarda en el disco un archivo xml, pero ahora intento crear el xml en memoria, con la clase xmlDocument para poder hacer modificaciones (añadirle el sello ...) y al final gurdarla.

Con xmltextwriter me estaba funcionando bien. El codigo es este:
Código:
Dim Nombre As String = "c:/1/prueba.xml"
Dim W As New XmlTextWriter(nombre, Encoding.UTF8)



        ' NODO PRINCIPAL: COMPROBANTE

        W.WriteStartDocument()

        W.WriteStartElement("Comprobante")
        W.WriteStartAttribute("xmlns")
        W.WriteValue("http://www.sat.gob.mx/cfd/2")
        W.WriteEndAttribute()

        W.WriteStartAttribute("xmlns:xsi")
        W.WriteValue("http://www.w3.org/2001/XMLSchema-instance")
        W.WriteEndAttribute()

        W.WriteStartAttribute("xmlns:implocal")
        W.WriteValue("http://www.sat.gob.mx/implocal")
        W.WriteEndAttribute()


        W.WriteStartAttribute("xsi:schemaLocation")
        W.WriteValue("http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd")
        W.WriteEndAttribute()

        W.WriteStartAttribute("version")
        W.WriteValue("2.0")
        W.WriteEndAttribute()

        W.WriteStartAttribute("serie") ' opcional
        W.WriteValue("E123456789")
        W.WriteEndAttribute()

        W.WriteStartAttribute("folio")
        W.WriteValue("1234567890")
        W.WriteEndAttribute()

        W.WriteStartAttribute("fecha")
        W.WriteValue("2010-06-07T18:20:50")
        W.WriteEndAttribute()

        W.WriteStartAttribute("sello")
        W.WriteValue("aqui va el sello")
        W.WriteEndAttribute()

        W.WriteStartAttribute("noAprobacion")
        W.WriteValue("12345678")
        W.WriteEndAttribute()

        W.WriteStartAttribute("anoAprobacion")
        W.WriteValue("2010")
        W.WriteEndAttribute()

		'poner los demas atributos: formaDePago, noCertificado, certificado, condiciones de pago, subtotal etc etc)

         


        '.................................................NODO  EMISOR
        W.WriteStartElement("emisor")

        W.WriteStartAttribute("RFC")
        W.WriteValue(emisor1.rfc)
        W.WriteEndAttribute()

        W.WriteStartAttribute("nombre")
        W.WriteValue(emisor1.nombre)
        W.WriteEndAttribute()


        'subnodo Direccion emisor

        W.WriteStartElement("DomicilioFiscal")

        W.WriteStartAttribute("calle")
        W.WriteValue(emisor1.calle)
        W.WriteEndAttribute()

        W.WriteStartAttribute("noExterior")     ' opcional
        W.WriteValue(emisor1.noExterior)
        W.WriteEndAttribute()

        W.WriteStartAttribute("Colonia")          ' opcional
        W.WriteValue(emisor1.colonia)
        W.WriteEndAttribute()

        W.WriteStartAttribute("Municipio")
        W.WriteValue(emisor1.municipio)
        W.WriteEndAttribute()

        '.....continuar con lo que falta: estado, pais, codigoPostal

       

        W.WriteEndElement()  'finaliza direccion

        W.WriteEndElement()

        '...........................................finaliza EMISOR

	   W.WriteEndDocument()      '.............finaliza documento 


        W.Flush()
        W.Close()
donde emisor1 es un objeto de la clase emisor, con todos los datos del emisor

el resultado seria:

Código:
<?xml version="1.0" encoding="utf-8" ?> 
- <Comprobante xmlns="http://www.sat.gob.mx/cfd/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:implocal="http://www.sat.gob.mx/implocal" xsi:schemaLocation="http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd" version="2.0" serie="E123456789" folio="1234567890" fecha="2010-06-07T18:20:50" sello="aqui va el sello" noAprobacion="12345678" anoAprobacion="2010">
- <emisor RFC="HAZ9903238SDF" nombre="HOTEL AZO S.A. DE C.V.">
   <DomicilioFiscal calle="GUSTAVO BAZ" noExterior="806" Colonia="SAN AMARO"   Municipio="NAUCALPAN" /> 
  </emisor>
  </Comprobante>
sin embargo, con xmlDocument, no consigo crear los atributos del nodo raiz:
el xmlns:xsi=... xsi:schemalocation=...

¿hay alguien que sepa como se hace ?
  #2 (permalink)  
Antiguo 09/12/2010, 19:10
 
Fecha de Ingreso: junio-2010
Mensajes: 23
Antigüedad: 4 años, 2 meses
Puntos: 1
Respuesta: Crear XML para factura electronica

Por ejemplo: con este codigo

Código:
Dim doc As XmlDocument = New XmlDocument()
    Dim Nodo As XmlNode
    Const NemspaceUri As String = "http://www.w3.org/2001/XMLSchema-instance"

        Dim version As System.Xml.XmlDeclaration
        version = doc.CreateXmlDeclaration("1.0", "utf-8", "")
        version.Encoding = "utf-8"
        doc.PreserveWhitespace = True
        doc.AppendChild(version)

        Nodo = doc.CreateNode(XmlNodeType.Element, "comprobante", "http://www.sat.gob.mx/cfd/2")

        Dim Atributo1 As XmlAttribute = doc.CreateAttribute("xsi", "comprobante", NemspaceUri)
        Atributo1.Value = NemspaceUri
        Nodo.Attributes.SetNamedItem(Atributo1)

        doc.AppendChild(Nodo)

me sale esto:

Código:
<?xml version="1.0" encoding="utf-8" ?> 
<comprobante xsi:comprobante="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sat.gob.mx/cfd/2" /> 

'
como pueden ver:

1: xmlns="http//..." aparece al final en lugar de al principio
2: aparece una linea: xsi:comprobante="http://...." que no se de donde sale
  #3 (permalink)  
Antiguo 09/12/2010, 23:48
 
Fecha de Ingreso: noviembre-2002
Ubicación: DF
Mensajes: 886
Antigüedad: 11 años, 9 meses
Puntos: 30
Respuesta: Crear XML para factura electronica

Yo coloque el Schemalocation con esto:


Dim atributo_xmlnsxsi As XmlAttribute = Doc.CreateAttribute("xmlns:xsi")
atributo_xmlnsxsi.Value = "http://www.w3.org/2001/XMLSchema-instance"

Dim atributo_schemaLocation As XmlAttribute = Doc.CreateAttribute("xsi:schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")
atributo_schemaLocation.Value = "http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd"
  #4 (permalink)  
Antiguo 10/12/2010, 10:46
 
Fecha de Ingreso: junio-2010
Mensajes: 23
Antigüedad: 4 años, 2 meses
Puntos: 1
Respuesta: Crear XML para factura electronica

Cita:
Iniciado por wwwmaster Ver Mensaje
Yo coloque el Schemalocation con esto:


Dim atributo_xmlnsxsi As XmlAttribute = Doc.CreateAttribute("xmlns:xsi")
atributo_xmlnsxsi.Value = "http://www.w3.org/2001/XMLSchema-instance"

Dim atributo_schemaLocation As XmlAttribute = Doc.CreateAttribute("xsi:schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")
atributo_schemaLocation.Value = "http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd"
Muy bien, gracias wwwmaster, ya vamos mucho mejor:

con el codigo
Código:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim version As System.Xml.XmlDeclaration
        version = doc.CreateXmlDeclaration("1.0", "utf-8", "")
        version.Encoding = "utf-8"
        doc.PreserveWhitespace = True
        doc.AppendChild(version)

        Nodo = doc.CreateNode(XmlNodeType.Element, "comprobante", "http://www.sat.gob.mx/cfd/2")

        Dim atributo_xmlnsxsi As XmlAttribute = doc.CreateAttribute("xmlns:xsi")
        atributo_xmlnsxsi.Value = "http://www.w3.org/2001/XMLSchema-instance"

        Dim atributo_implocal As XmlAttribute = doc.CreateAttribute("xmlns:implocal")
        atributo_implocal.Value = "http://www.sat.gob.mx/implocal"


        Dim atributo_schemaLocation As XmlAttribute = doc.CreateAttribute("xsi:schemaLocation")
        atributo_schemaLocation.Value = "http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd"

        Dim atributo_serie As XmlAttribute = doc.CreateAttribute("serie")
        atributo_serie.Value = "serieNo 123456789"

        doc.AppendChild(Nodo)
        doc.DocumentElement.SetAttributeNode(atributo_xmlnsxsi)

        doc.DocumentElement.SetAttributeNode(atributo_implocal)

        doc.DocumentElement.SetAttributeNode(atributo_schemaLocation)
        doc.DocumentElement.SetAttributeNode(atributo_serie)
me sale:

Código:
<?xml version="1.0" encoding="utf-8" ?> 
<comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:implocal="http://www.sat.gob.mx/implocal" schemaLocation="http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd" serie="serieNo 123456789" xmlns="http://www.sat.gob.mx/cfd/2" /> 
'
Lo que no consigo es poner el atributo xmlns="http://www.sat.gob.mx/cfd/2" en primer lugar, como aparece en las especificaciones del SAT, Con el xmltextwriter me salia bien, al principio. ¿alguien sabe porqué?
  #5 (permalink)  
Antiguo 10/12/2010, 14:25
 
Fecha de Ingreso: junio-2010
Mensajes: 23
Antigüedad: 4 años, 2 meses
Puntos: 1
Respuesta: Crear XML para factura electronica

Bueno, ya encontre como:

despues de crear el nodo principal (comprobante) hay que crear manualmente el atributo xmlns, asi:

Código:
 Nodo = doc.CreateNode(XmlNodeType.Element, "comprobante", "http://www.sat.gob.mx/cfd/2")
        doc.AppendChild(Nodo)


        Dim atributo_xmlns As XmlAttribute = doc.CreateAttribute("xmlns")
        atributo_xmlns.Value = "http://www.sat.gob.mx/cfd/2"
        doc.DocumentElement.SetAttributeNode(atributo_xmlns)

        Dim atributo_xmlnsxsi As XmlAttribute = doc.CreateAttribute("xmlns:xsi")
        atributo_xmlnsxsi.Value = "http://www.w3.org/2001/XMLSchema-instance"
        doc.DocumentElement.SetAttributeNode(atributo_xmlnsxsi)

de esta forma, ya aparece en primer lugar.
  #6 (permalink)  
Antiguo 12/04/2011, 16:02
 
Fecha de Ingreso: febrero-2011
Mensajes: 11
Antigüedad: 3 años, 6 meses
Puntos: 1
Respuesta: Crear XML para factura electronica

Cita:
Iniciado por Oscargf Ver Mensaje
Muy bien, gracias wwwmaster, ya vamos mucho mejor:

con el codigo
Código:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim version As System.Xml.XmlDeclaration
        version = doc.CreateXmlDeclaration("1.0", "utf-8", "")
        version.Encoding = "utf-8"
        doc.PreserveWhitespace = True
        doc.AppendChild(version)

        Nodo = doc.CreateNode(XmlNodeType.Element, "comprobante", "http://www.sat.gob.mx/cfd/2")

        Dim atributo_xmlnsxsi As XmlAttribute = doc.CreateAttribute("xmlns:xsi")
        atributo_xmlnsxsi.Value = "http://www.w3.org/2001/XMLSchema-instance"

        Dim atributo_implocal As XmlAttribute = doc.CreateAttribute("xmlns:implocal")
        atributo_implocal.Value = "http://www.sat.gob.mx/implocal"


        Dim atributo_schemaLocation As XmlAttribute = doc.CreateAttribute("xsi:schemaLocation")
        atributo_schemaLocation.Value = "http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd"

        Dim atributo_serie As XmlAttribute = doc.CreateAttribute("serie")
        atributo_serie.Value = "serieNo 123456789"

        doc.AppendChild(Nodo)
        doc.DocumentElement.SetAttributeNode(atributo_xmlnsxsi)

        doc.DocumentElement.SetAttributeNode(atributo_implocal)

        doc.DocumentElement.SetAttributeNode(atributo_schemaLocation)
        doc.DocumentElement.SetAttributeNode(atributo_serie)
me sale:

Código:
<?xml version="1.0" encoding="utf-8" ?> 
<comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:implocal="http://www.sat.gob.mx/implocal" schemaLocation="http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd" serie="serieNo 123456789" xmlns="http://www.sat.gob.mx/cfd/2" /> 
'
Lo que no consigo es poner el atributo xmlns="http://www.sat.gob.mx/cfd/2" en primer lugar, como aparece en las especificaciones del SAT, Con el xmltextwriter me salia bien, al principio. ¿alguien sabe porqué?
hola me surgio el siguiente problema, cuando creo el atributo xsi:schemaLocation, con el siguiente codigo:

XmlAttribute xsischemalocation = xmlDoc.CreateAttribute("xsi:schemaLocation");
xsischemalocation.Value = xsi_schemalocation;
xmlDoc.DocumentElement.SetAttributeNode(xsischemal ocation);

solo crea el atributo asi schemaLocation, sin el xsi:, a que se puede deber este problema? :(

ya habia preguntado esto por otro lado, pero veo que a ti te lo guarda igual y me preguntaba si lo resolviste?

saludos
  #7 (permalink)  
Antiguo 14/05/2011, 14:01
 
Fecha de Ingreso: agosto-2010
Mensajes: 51
Antigüedad: 4 años
Puntos: 12
Respuesta: Crear XML para factura electronica

Cita:
Iniciado por gerloxxx Ver Mensaje
hola me surgio el siguiente problema, cuando creo el atributo xsi:schemaLocation, con el siguiente codigo:

XmlAttribute xsischemalocation = xmlDoc.CreateAttribute("xsi:schemaLocation");
xsischemalocation.Value = xsi_schemalocation;
xmlDoc.DocumentElement.SetAttributeNode(xsischemal ocation);

solo crea el atributo asi schemaLocation, sin el xsi:, a que se puede deber este problema? :(

ya habia preguntado esto por otro lado, pero veo que a ti te lo guarda igual y me preguntaba si lo resolviste?

saludos
A mi me pasa exactamente lo mismo
Aún con la falta de este prefijo xsi pude mandar a timbrar varios xml

Pudieron resolver el problema del prefijo xsi que no aparece en el atributo schemaLocation ?????

Les agradecería su ayuda

Saludos
Halcón Divino.
Monterrey Nuevo Léon
México
  #8 (permalink)  
Antiguo 07/04/2014, 16:43
Avatar de NetFcruz  
Fecha de Ingreso: agosto-2012
Ubicación: Reynosa
Mensajes: 31
Antigüedad: 2 años
Puntos: 0
Pregunta Respuesta: Crear XML para factura electronica

Cita:
Iniciado por HalconDivino Ver Mensaje
A mi me pasa exactamente lo mismo
Aún con la falta de este prefijo xsi pude mandar a timbrar varios xml

Pudieron resolver el problema del prefijo xsi que no aparece en el atributo schemaLocation ?????

Les agradecería su ayuda

Saludos
Halcón Divino.
Monterrey Nuevo Léon
México
Que tal amigo ya resolviste este detalle, tengo el modod de como general el xml pero no de sellar /timbrar por sat.
Saludos.
__________________
!El conocimiento se LIMITA cuando dices NO PUEDO!

By NetFcruz
  #9 (permalink)  
Antiguo 07/04/2014, 21:04
 
Fecha de Ingreso: noviembre-2002
Ubicación: DF
Mensajes: 886
Antigüedad: 11 años, 9 meses
Puntos: 30
Respuesta: Crear XML para factura electronica

Public xmlnsxsi As String
Public xsischemaLocation As String



Dim atributo_schemaLocation As XmlAttribute = Doc.CreateAttribute("xsi:schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")

atributo_schemaLocation.Value = "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd"

NdCom.Attributes.Append(atributo_schemaLocation)


o con:
agregaAtributo("S", "C", Doc, NdCom, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")

Private Sub agregaAtributo(ByVal obligatorio As String, ByVal tipo As String, ByRef ccxml As XmlDocument, ByRef nodo As XmlNode, ByVal atributo As String, ByVal valor As String)
'RUTINA PARA AGREGAR ATRIBUTOS AL XML, LLAMA A SU VEZ A OTRAS 2 FUNCIONES
' la ultima variable indicador viene mayormente en blanco (quitar para version ASP)
log("cComprobante.agregaAtributo obligatorio=" & obligatorio & " tipo=" & tipo & " atributo=" & atributo & " valor=" & valor)
Dim nTemporal As XmlAttribute
If tipo = "$" Then valor = String.Format("{0:0.00}", Convert.ToDouble(valor))

valor = quitarCaracteresInvalidos(valor)
If (agregar(obligatorio, tipo, valor)) = "SI" Then

nTemporal = ccxml.CreateAttribute(atributo)
nTemporal.Value = valor
nodo.Attributes.Append(nTemporal)
End If
End Sub



La zona horaria es GMT -6. Ahora son las 05:25.
SEO by vBSEO 3.3.2