Ayuda al crear XML desde VB .Net

#1
Hola a todos, espero me puedan ayudar con este código porque no he podido dar con la instrucción adecuada. Estoy haciendo el desarrollo de la factura electrónica en VB .Net 2008 y mi problema está al poner el parámetro de "xmlns" que requiere hacienda en el archivo. A continuación escribo como estoy haciendo el proceso:

Dim settings As New XmlWriterSettings()

settings.Indent = True
settings.NewLineOnAttributes = True

Using writer As XmlWriter = XmlWriter.Create("C:\factura.xml", settings)

writer.WriteStartDocument()
writer.WriteStartElement("Comprobante")

writer.WriteAttributeString("xmlns", "http://www.sat.gob.mx/cfd/2") 'EN ESTA LINEA ES DONDE ME APARECE ERROR "No se puede volver a definir el prefijo '' de '' a 'http://www.sat.gob.mx/cfd/2' dentro de la misma etiqueta de elemento inicial"

writer.WriteAttributeString("xmlns", "xsi", Nothing, "http://www.w3.org/2001/XMLSchema-instance")
writer.WriteAttributeString("xsi", "schemaLocation", Nothing, "http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd")

writer.WriteStartAttribute("version")
writer.WriteValue("2.0")
writer.WriteEndAttribute()
.
.
.
.
.
ETC

writer.WriteEndElement()

writer.WriteEndDocument()
writer.Flush()

Lo que yo espero es que el XML quede de esta forma:

<?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" xsi:schemaLocation="http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd" version="2.0" serie="EL" folio="1764" ...............ETC

Medio me funciona si cambio la línea del error por la siguiente

writer.WriteStartElement("Comprobante", "http://www.sat.gob.mx/cfd/2")

Así ya no marca error y se crea el XML, pero la parte del "xmlns" me la manda hasta el final del elemento y no antes de xmlns:xsi y xsi:schemaLocation

Espero haberme dado a entender y ojalá alguien me pueda ayudar con esto.

Muchas gracias
 

ChrisOnasis

Bovino maduro
#2
Jajaj, como esperaba con una pregunta seria donde nadie sabe qué pedo ya no te critican... mira amigo, además de que es media obvia la respuesta.

Amigo el atributo xmlns es el NameSpace del XML no importa si está al final o en medio del elemento, no te preocupes, a menos que esté mal implementado el que lee ese Xml generado es decir, que lo esté haciendo a nivel archivo (físicamente).

Un xmlns funciona en cualquier posición, si marca error de lectura, entonces el programa que sirve para leer, NO ESTÁ BIEN HECHO.


 
#3
Gracias por la respuesta, como soy nuevo con el manejo de los XML no se bien que onda, aunque yo también pensé lo que comentas, osea que no debería importar el lugar siempre y cuando lo tenga; solamente que en los ejemplos que tengo a la mano siempre está al principio.

Gracias por contestar.
 
#4
Es curioso que salga al final. En las facturas que tengo revisado viene al principio, asi que debe haber otra forma.
Estoy empezando con la facturacion electronica. Si puedes no dejes el tema.

Saludos
Oscar
 
#5
Hola Oscar, pués te comento que en la forma que uso para crear los archivos XML no he encontrado la instrucción correcta para poner la parte al principio del archivo, sin embargo todo parece indicar que no importa, ya que el validador del SAT en línea me acepta sin problemas los archivos XML ya sellados digitalmente.
 
#6
Parece que asi funciona y ya sale al principio:
Código:
Dim W As New XmlTextWriter("C:\1\factura2.xml", Encoding.UTF8)

        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("xsi:schemaLocation")
        W.WriteValue("http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.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()


        

        'nodo emisor

        W.WriteStartElement("emisor")

        W.WriteStartAttribute("nombre")
        W.WriteValue("Pepito grillo S.A. de C.V.")
        W.WriteEndAttribute()


        W.WriteStartAttribute("RFC")
        W.WriteValue("PGR991223SDF")
        W.WriteEndAttribute()

        'subnodo Direccion emisor

        W.WriteStartElement("DomicilioFiscal")

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

        W.WriteStartAttribute("noExterior")
        W.WriteValue("45")
        W.WriteEndAttribute()

        W.WriteStartAttribute("Colonia")
        W.WriteValue("San Federico")
        W.WriteEndAttribute()

        W.WriteStartAttribute("Municipio")
        W.WriteValue("Benito Juarez")
        W.WriteEndAttribute()

        W.WriteStartAttribute("estado")
        W.WriteValue("DF")
        W.WriteEndAttribute()

        W.WriteStartAttribute("pais")
        W.WriteValue("Mexico")
        W.WriteEndAttribute()

        W.WriteStartAttribute("codigoPostal")
        W.WriteValue("51200")
        W.WriteEndAttribute()

        W.WriteEndElement()  'finaliza direccion

        W.WriteEndElement()  'finaliza emisor

        'nodo receptor
        W.WriteStartElement("receptor")

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

        W.WriteStartAttribute("RFC")
        W.WriteValue("RFCRec")
        W.WriteEndAttribute()

        'subnodo direccion receptor


        W.WriteStartElement("Domicilio")

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

        W.WriteStartAttribute("noExterior")
        W.WriteValue("122")
        W.WriteEndAttribute()

        W.WriteStartAttribute("noInterior")
        W.WriteValue("3-X")
        W.WriteEndAttribute()

        W.WriteStartAttribute("Colonia")
        W.WriteValue("San Simon")
        W.WriteEndAttribute()

        W.WriteStartAttribute("Localidad")
        W.WriteValue("G.A.M")
        W.WriteEndAttribute()

        W.WriteStartAttribute("Referencia")
        W.WriteValue("Tultitlan")
        W.WriteEndAttribute()

        W.WriteStartAttribute("estado")
        W.WriteValue("Distrito Federal")
        W.WriteEndAttribute()

        W.WriteStartAttribute("pais")
        W.WriteValue("Mexico")
        W.WriteEndAttribute()

        W.WriteStartAttribute("codigoPostal")
        W.WriteValue("52100")
        W.WriteEndAttribute()


        W.WriteEndElement() 'finaliza direccion receptor
        W.WriteEndElement()  'finaliza receptor


          '.......................................
          'aqui van los otros nodos y subnodos
          '....................................... 


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


        W.Flush()
        W.Close()

como encriptas a RSA?
yo estoy intentando con .net y parece que funciona, solo que la clave privada que proporciona hacienda (.key) hay que convertirla a xml ¿o no?

Saludos

Oscar
 
#7
Cosas raras, lo puse como me comentas e igual me aparece el error de "No se puede volver a definir el prefijo '' de '' a 'http://www.sat.gob.mx/cfd/2' dentro de la misma etiqueta de elemento inicial." De lo que me comentas pues yo no estoy haciendo uso de librerias de .Net, en mi caso estoy usando una herramientas de terceros de cryptosys.
 
#10
Hola yo tambien estoy realizando un programa de facturas ero mi problema es que no se como realizar el ciclo para que me imprima los distintos productos de la empresa codigo:
'los atributos se repetiran tantas veces como productos haya
Dim y = 0
For y = 0 To numtot Step 1
W.WriteStartElement(
"Concepto")
W.WriteStartAttribute(
"cantidad")
W.WriteValue(vectorCampos(43))
W.WriteEndAttribute()
W.WriteStartAttribute(
"unidad")
W.WriteValue(
"cadena")
W.WriteEndAttribute()
W.WriteStartAttribute(
"noIdentificacion")
W.WriteValue(
"cadena")
W.WriteEndAttribute()
W.WriteStartAttribute(
"descripcion")
W.WriteValue(vectorCampos(44))
W.WriteEndAttribute()
W.WriteStartAttribute(
"valorUnitario")
W.WriteValue(vectorCampos(46))
W.WriteEndAttribute()
W.WriteStartAttribute(
"importe")
W.WriteValue(vectorCampos(47))
W.WriteEndAttribute()
W.WriteEndElement()
'finaliza informacion concepto
Next

hace el ciclo pero repite solamente el mismo producto y sus caracteristicas y yo quiero que repita los diferentes productos que aparecen el la cadena original no se si puedan ayudarme. gracias
 
#12
Hola Oscar, mira tengo una serie de inconvenientes, pues he realizado la creación de nodos y existe uno que tiene un subnodo, ya creado este ultimo (el subnodo), quiero que se devuelva al nodo principal Agradezco tu colaboracion. aqui te va mi ejemplo:



Dim W As New XmlTextWriter("HL7.xml", System.Text.Encoding.UTF8)

W.WriteStartDocument()


W.WriteStartElement("hl7", "PRPA_IN101306UV", "urn:hl7-org:v3")


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


W.WriteStartAttribute("xsi:schemaLocation")
W.WriteValue("urn:hl7-org:v3 ../../../../../HL7_v3_Schemas/v3ballot_schemasexamples_2010MAY/html/processable/multicacheschemas/PRPA_IN101306UV.xsd")
W.WriteEndAttribute()



W.WriteStartAttribute("xmlns:hl7co")
W.WriteValue("urn:hl7-org:v3")
W.WriteEndAttribute()


W.WriteStartAttribute("ITSVersion")
W.WriteValue("XML_1.0")
W.WriteEndAttribute()



'*nodo emisor

W.WriteStartElement("hl7:realmCode")
W.WriteStartAttribute("code")
W.WriteValue("CO")
W.WriteEndElement()

W.WriteStartElement("hl7:templateId")
W.WriteStartAttribute("extension")
W.WriteValue("PRPA_IN101306CO00")
W.WriteEndElement()


W.WriteStartElement("hl7:id")
W.WriteStartAttribute("extension")
W.WriteValue("PersonFindCandidatesResponse_example_001")
W.WriteEndElement()

W.WriteStartElement("hl7:creationTime")
W.WriteStartAttribute("value")
W.WriteValue("20110228110208")
W.WriteEndElement()

W.WriteStartElement("hl7:versionCode")
W.WriteStartAttribute("code")
W.WriteValue("Ballot2009Sep")
W.WriteEndElement()

W.WriteStartElement("hl7:interactionId")
W.WriteStartAttribute("root")
W.WriteValue("2.16.840.1.113883.1.6")
W.WriteEndAttribute()
W.WriteStartAttribute("extension")
W.WriteValue("PRPA_IN101306UV")
W.WriteEndElement()

W.WriteStartElement("hl7:processingCode")
W.WriteStartAttribute("code")
W.WriteValue("P")
W.WriteEndElement()

W.WriteStartElement("hl7:processingModeCode")
W.WriteStartAttribute("code")
W.WriteValue("T")
W.WriteEndElement()

W.WriteStartElement("hl7:acceptAckCode")
W.WriteStartAttribute("code")
W.WriteValue("NE")
W.WriteEndElement()




W.WriteStartElement("hl7:receiver")
W.WriteStartAttribute("typeCode")
W.WriteValue("RCV")
W.WriteEndAttribute()

'<hl7:device classCode="DEV" determinerCode="INSTANCE">

W.WriteStartElement("hl7:device")
W.WriteStartAttribute("classCode")
W.WriteValue("DEV")
W.WriteEndAttribute()
W.WriteStartAttribute("determinerCode")
W.WriteValue("INSTANCE")
W.WriteEndAttribute()

W.WriteStartElement("hl7:id")
W.WriteStartAttribute("extension")
W.WriteValue("0001")
'W.WriteEndElement()
W.WriteEndAttribute()




'QUIERO QUE ESTE NODO VUELVA CON A LA LISTA DE NODOS QUE LLEVO NORMALMENTE
W.WriteStartElement("hl7:respondTo")

W.WriteStartAttribute("typeCode")
W.WriteValue("RSP")
W.WriteEndAttribute()


W.Flush()
W.Close()
 

jmvd70

Bovino adicto
#13
Hola yo tambien estoy realizando un programa de facturas ero mi problema es que no se como realizar el ciclo para que me imprima los distintos productos de la empresa codigo:
'los atributos se repetiran tantas veces como productos haya
Dim y = 0
For y = 0 To numtot Step 1
W.WriteStartElement(
"Concepto")
W.WriteStartAttribute(
"cantidad")
W.WriteValue(vectorCampos(43))
W.WriteEndAttribute()
W.WriteStartAttribute(
"unidad")
W.WriteValue(
"cadena")
W.WriteEndAttribute()
W.WriteStartAttribute(
"noIdentificacion")
W.WriteValue(
"cadena")
W.WriteEndAttribute()
W.WriteStartAttribute(
"descripcion")
W.WriteValue(vectorCampos(44))
W.WriteEndAttribute()
W.WriteStartAttribute(
"valorUnitario")
W.WriteValue(vectorCampos(46))
W.WriteEndAttribute()
W.WriteStartAttribute(
"importe")
W.WriteValue(vectorCampos(47))
W.WriteEndAttribute()
W.WriteEndElement()
'finaliza informacion concepto
Next

hace el ciclo pero repite solamente el mismo producto y sus caracteristicas y yo quiero que repita los diferentes productos que aparecen el la cadena original no se si puedan ayudarme. gracias
Saludos partner

Debes usar un for each, en lugar de un for normal.

Los demás creo que están tirando mucho código a lo loco, yo los genero como archivos de texto plano con el formato necesario y te quitas de muchas broncas con las librerias de NET.

Suerte.
 
#14
Ofrezco una .dll para .net a modico precio que permite: Generar el XML (se instancia el objeto y a traves de propiedades se setean los datos), devuelve la CADENA ORIGINAL, luego mediante otra llamada, enviando como parametro el .key y la llave privada, se genera el sello digital, la cual se incorpora luego al XML y te lo devuelve para que lo grabes donde desees.

Contacto: jasistemas at hotmail.com
 
Arriba