Closed jesuslerma closed 10 years ago
Hola, una opción es que utilices xpath para leer el elemento que contiene la versión y en base a eso decidas cual objeto utilizar.
Saludos
2013/10/9 jesuslerma notifications@github.com
Que tal, me gustaría saber si existe una función para validad que versión de factura es la que contiene el inputstream.
Tengo el siguiente código:
InputStream reader = null; Comprobante comprobanteTest = null; //Comprobante es de //mx.bigdata.sat.cfdi.v32.schema.Comprobante; comprobanteTest = CFDv32.newComprobante(reader);
Y esto me marca el error: unexpected element (uri:"http://www.sat.gob.mx/cfd/2", local:"Comprobante"). Expected elements are <{ http://www.sat.gob.mx/cfd/3}Comprobante>,<{ http://www.sat.gob.mx/TimbreFiscalDigital}TimbreFiscalDigital>
Esto es por que el xml que leo en reader es cfd2. Entonces si leo con CFDv2 ya no marca error.
¿Cómo puedo validar que un xml sea versión 2 o versión 3.2?
Muchas gracias de antemano y felicidades por su estupenda librería.
Saludos!
— Reply to this email directly or view it on GitHubhttps://github.com/bigdata-mx/factura-electronica/issues/82 .
Excelente comentario, de hecho estoy utilizando un código basado en el método getVersion CFDFactory. Ahora el problema que tengo es que después de valdiar el InputStream me marca error, pero no sé a que se deba, quizá no se este cerrando bien el reader. Este es el código que estoy utilizando:
//Esté es el Método basado en CFDFACTORY public String getVersion(byte[] data) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new ByteArrayInputStream(data)); XPathFactory xfactory = XPathFactory.newInstance(); XPath xpath = xfactory.newXPath(); return (String) xpath.evaluate("/Comprobante/@version", doc); }
//Así lo mando a llamar desde main String version = ""; try { byte[] bytes = ByteStreams.toByteArray(reader); version = this.getVersion(bytes); } catch (Exception e1) { e1.printStackTrace(); System.out.println(e1.getMessage()); } try{ System.out.println(version);//Me muestra 3.2 Comprobante32 = CFDv32.newComprobante(reader); } catch (Exception e) { this.mensajeError = "Error al crear un comprobante a partir del archivo // " + archivoFactura.getKey() + " " + *// Mensaje de error // " + e.getMessage(); System.out.println( this.mensajeError ); }
Este código me lanza el siguiente error : Error al crear un comprobante a partir del archivo // BMI9704113PA/179/inbox/CFD_3724.xml // Mensaje de error // null
Si quito la parte donde ejecuto this.getVersion no me marca error, y me lee bien el Comprobante.
El problema es que
byte[] bytes = ByteStreams.toByteArray(reader);
Consume todos los bytes del reader y cuando haces
Comprobante32 = CFDv32.newComprobante(reader);
ya no quedan datos que leer del reader, puedes hacer lo siguiente:
Comprobante32 = CFDv32.newComprobante(new ByteArrayInputStream(bytes));
Saludos
2013/10/10 jesuslerma notifications@github.com
Excelente comentario, de hecho estoy utilizando un código basado en el método getVersion CFDFactory. Ahora el problema que tengo es que después de valdiar el InputStream me marca error, pero no sé a que se deba, quizá no se este cerrando bien el reader. Este es el código que estoy utilizando:
//Esté es el Método basado en CFDFACTORY public String getVersion(byte[] data) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new ByteArrayInputStream(data)); XPathFactory xfactory = XPathFactory.newInstance(); XPath xpath = xfactory.newXPath(); return (String) xpath.evaluate("/Comprobante/@versionhttps://github.com/version", doc); }
//Así lo mando a llamar desde main String version = ""; try { byte[] bytes = ByteStreams.toByteArray(reader); version = this.getVersion(bytes); } catch (Exception e1) { e1.printStackTrace(); System.out.println(e1.getMessage()); } try{ System.out.println(version);//Me muestra 3.2 Comprobante32 = CFDv32.newComprobante(reader); } catch (Exception e) { this.mensajeError = "Error al crear un comprobante a partir del archivo // " + archivoFactura.getKey() + " " + *// Mensaje de error // " + e.getMessage(); System.out.println( this.mensajeError ); }
Este código me lanza el siguiente error : Error al crear un comprobante a partir del archivo // BMI9704113PA/179/inbox/CFD_3724.xml // Mensaje de error // null
Si quito la parte donde ejecuto this.getVersion no me marca error, y me lee bien el Comprobante.
— Reply to this email directly or view it on GitHubhttps://github.com/bigdata-mx/factura-electronica/issues/82#issuecomment-26073003 .
Muchas gracias, eso solucionó el problema.
Saludos!
Que tal, me gustaría saber si existe una función para validad que versión de factura es la que contiene el inputstream.
Tengo el siguiente código:
InputStream reader = null; Comprobante comprobanteTest = null; //Comprobante es de //mx.bigdata.sat.cfdi.v32.schema.Comprobante; comprobanteTest = CFDv32.newComprobante(reader);
Y esto me marca el error: unexpected element (uri:"http://www.sat.gob.mx/cfd/2", local:"Comprobante"). Expected elements are <{http://www.sat.gob.mx/cfd/3}Comprobante>,<{http://www.sat.gob.mx/TimbreFiscalDigital}TimbreFiscalDigital>
Esto es por que el xml que leo en reader es cfd2. Entonces si leo con CFDv2 ya no marca error.
¿Cómo puedo validar que un xml sea versión 2 o versión 3.2?
Muchas gracias de antemano y felicidades por su estupenda librería.
Saludos!