Open LBrito opened 10 years ago
Amigo, eso lo puedes hacer tú desde el código, haciendo lo siguiente:
cfdi.addNamespace("http://www.sat.gob.mx/nomina", "nomina");
Lo interesante sería, poder agregar un namespace en las addendas
Hola! Precisamente eso intenté, agrego namespaces de forma dinámica y si funciona pero no agrega las referencias a los xsd:
namespaces.each{ name, uri ->
cfdi.addNamespace(uri, name)
}
Me di cuenta que siempre se sobreescribe "schemaLocation" en la línea que comenté anteriormente entregándome siempre:
xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd"
Y no (en el caso del complemento de nómina):
xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd http://www.sat.gob.mx/nomina http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina11.xsd"
Buen dia LBrito, tengo un problema similar, requiero poner el atributo xmlns en el nodo de la Addenda, te fue posible solucionarlo?
Addenda Nodo xmlns="http://addenda.example.com" .... /Nodo /Addenda
Me imagino que sólo abriendo el archivo y agregándolo "manualmente", habrá que meterle mano a la librería para que se puedan setear estos valores, por el momento yo no puedo debido a que tengo mucho trabajo, pero en cuánto me desocupe lo revisaré o esperemos que alguien más lo resuelva.
Saludos!!!
Para una solución rápida yo sobrecargué el método guardar de la clase CFDv32.java:
public void guardar(OutputStream out, String... otherSchemas) throws Exception {
Marshaller m = context.createMarshaller();
m.setProperty("com.sun.xml.bind.namespacePrefixMapper",
new NamespacePrefixMapperImpl(localPrefixes));
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
"http://www.sat.gob.mx/cfd/3 "
+ "http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd");
for (String schema : otherSchemas) {
m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, m.getProperty(Marshaller.JAXB_SCHEMA_LOCATION) + " " + schema);
}
byte[] xmlHeaderBytes = XML_HEADER.getBytes("UTF8");
out.write(xmlHeaderBytes);
m.marshal(document, out);
}
y por ejemplo yo lo usé para agregar el schemaLocation de nómina, de esta manera:
cfd.guardar((new FileOutputStream("nomina.xml")),"http://www.sat.gob.mx/nomina http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina11.xsd");
Pero si se requieren agreagar más schemaLocation pues basta con separarlos con comas.
Espero que les sirva. Saludos!
Hola @diegokuh una duda solo agregaste el método en la clase, ya que yo hice lo mismo pero al momento de querer hacer uso de este en mi proyecto me marca el siguiente error:
java.lang.NoSuchMethodError
No se si tenga que agregarlo en algún otro lado además de la interface CFD.
De ante mano gracias por la ayuda.
@aperezc48 ya tiene rato que no veo el proyecto, pero quizá en recientes versiones ya arreglaron ese detalle. Si no checa que la firma del método sobrecargado esté también en la interfaz de la referencia del objeto que estas usando para llamarlo.
buenas tardes, una duda, el xsi:schemaLocation se puede modificar despues de que se sello y timbró el comprobante, mi duda es por que, en mi caso particular, sello el comprobante y lo mando a timbrar, posterior a eso, guardo el xml y modifico el xsi:schemaLocation, eso es valido?
En la línea 194 de la clase CFDv32, en el método utilizado para guardar el documento, puedo notar que se agrega sólo el esquema general del CDFI.
Aquí: https://github.com/bigdata-mx/factura-electronica/blob/d69d4d1f1144faae4beadce559cde2812679d6e7/src/main/java/mx/bigdata/sat/cfdi/CFDv32.java#L194
Sin embargo, creo que sería bueno que se pudiera agregar el de todos los complementos utilizados. Ej. "http://www.sat.gob.mx/cfd/nomina http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina.xsd"
¿Habrá alguna solución para esta cuestión en un futuro cercano?