Buen día todos miren que llevo días queriendo hacer unas validaciones para unos archivos xml del SAT de manera que opte por crear mi propia estructura en clases sin embargo tengo un pequeño detalle al momento de crear el xml yo necesito crear un nodo de la siguiente manera:
pero por más que intento solo consigo el siguiente nodo:
ya le he dado vueltas por muchos lados y no lo consigo mi bean principal es el siguiente:
Código:
public void createXmlSchema() throws JAXBException{
try{
ServletContext servletContext= (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
File file = new File(servletContext.getRealPath("files/test.xml"));
ComprobanteMine comprobante = new ComprobanteMine();
comprobante.setVersion("3.2");
comprobante.setSerie("HDS");
comprobante.setFolio("3");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss");
comprobante.setFormaDePago("PAGO EN UNA SOLA EXHIBICIÓN");
comprobante.setCondicionesDePago("CONTADO");
comprobante.setMetodoDePago("Efectivo");
comprobante.setNoCertificado("20001000000200001745");
comprobante.setMotivoDescuento("Deducciones nómina");
comprobante.setTipoCambio("1.00");
comprobante.setMoneda("MXP");
comprobante.setLugarExpedicion("Aguascalientes, Ags");
//Adición clase receptor
ReceptorMine rec = new ReceptorMine();
rec.setRfc("RRRFFFCCC");
rec.setNombre("NOm NOm NOm");
rec.setUsoCfdi("test");
comprobante.setReceptor(rec);
JAXBContext context = JAXBContext.newInstance(ComprobanteMine.class);
Marshaller m = context.createMarshaller();
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/cfdv33.xsd");
m.marshal(comprobante, System.out);
m.marshal(comprobante, file);
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
mi clase receptor la tengo así:
Código:
package Controlador;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlRootElement(name = "Receptor",namespace = "cfdi")
@XmlType(name ="Receptor",propOrder = {"rfc", "nombre", "usoCfdi"})
public class ReceptorMine {
@XmlAttribute(name = "UsoCFDI")
public String getUsoCfdi() {
return usoCfdi;
}
public void setUsoCfdi(String usoCfdi) {
this.usoCfdi = usoCfdi;
}
@XmlAttribute(name = "Rfc")
public String getRfc() {
return rfc;
}
public void setRfc(String rfc) {
this.rfc = rfc;
}
@XmlAttribute(name = "Nombre")
public String getNombre() {
return Nombre;
}
public void setNombre(String Nombre) {
this.Nombre = Nombre;
}
private String rfc;
private String Nombre;
private String usoCfdi;
}
Y mi clase Comprobante la tengo algo así:
Código:
package Controlador;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlRootElement(namespace = "http://www.sat.gob.mx/cfd/3", name="Comprobante")
public class ComprobanteMine {
public ComprobanteMine(){
}
private ReceptorMine Receptor;
private String version;
private String Serie;
private String Folio;
private String fecha;
private String tipoDeComprobante;
private String formaDePago;
private String condicionesDePago;
private String metodoDePago;
private String noCertificado;
private String subTotal;
private String descuento;
private String motivoDescuento;
private String TipoCambio;
private String Moneda;
private String total;
private String LugarExpedicion;
private String sello;
public ReceptorMine getReceptor(){
return Receptor;
}
public void setReceptor(ReceptorMine Receptor){
this.Receptor=Receptor;
}
@XmlAttribute(name = "Version")
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
@XmlAttribute(name = "Serie")
public String getSerie() {
return Serie;
}
public void setSerie(String Serie) {
this.Serie = Serie;
}
@XmlAttribute(name = "Folio")
public String getFolio() {
return Folio;
}
public void setFolio(String Folio) {
this.Folio = Folio;
}
@XmlAttribute(name = "Fecha")
public String getFecha() {
return fecha;
}
public void setFecha(String fecha) {
this.fecha = fecha;
}
@XmlAttribute(name = "TipoDeComprobante")
public String getTipoDeComprobante() {
return tipoDeComprobante;
}
public void setTipoDeComprobante(String tipoDeComprobante) {
this.tipoDeComprobante = tipoDeComprobante;
}
@XmlAttribute
public String getFormaDePago() {
return formaDePago;
}
public void setFormaDePago(String formaDePago) {
this.formaDePago = formaDePago;
}
@XmlAttribute
public String getCondicionesDePago() {
return condicionesDePago;
}
public void setCondicionesDePago(String condicionesDePago) {
this.condicionesDePago = condicionesDePago;
}
@XmlAttribute
public String getMetodoDePago() {
return metodoDePago;
}
public void setMetodoDePago(String metodoDePago) {
this.metodoDePago = metodoDePago;
}
@XmlAttribute
public String getNoCertificado() {
return noCertificado;
}
public void setNoCertificado(String noCertificado) {
this.noCertificado = noCertificado;
}
@XmlAttribute
public String getSubTotal() {
return subTotal;
}
public void setSubTotal(String subTotal) {
this.subTotal = subTotal;
}
@XmlAttribute
public String getDescuento() {
return descuento;
}
public void setDescuento(String descuento) {
this.descuento = descuento;
}
@XmlAttribute
public String getMotivoDescuento() {
return motivoDescuento;
}
public void setMotivoDescuento(String motivoDescuento) {
this.motivoDescuento = motivoDescuento;
}
@XmlAttribute
public String getTipoCambio() {
return TipoCambio;
}
public void setTipoCambio(String TipoCambio) {
this.TipoCambio = TipoCambio;
}
@XmlAttribute
public String getMoneda() {
return Moneda;
}
public void setMoneda(String Moneda) {
this.Moneda = Moneda;
}
@XmlAttribute
public String getTotal() {
return total;
}
public void setTotal(String total) {
this.total = total;
}
@XmlAttribute
public String getLugarExpedicion() {
return LugarExpedicion;
}
public void setLugarExpedicion(String LugarExpedicion) {
this.LugarExpedicion = LugarExpedicion;
}
@XmlAttribute
public String getSello() {
return sello;
}
public void setSello(String sello) {
this.sello = sello;
}
}
Como comentario adicional cree un package para controlar los names spaces que está definido de la siguiente manera:
Código:
@XmlSchema(namespace = "http://www.sat.gob.mx/cfd/3",
xmlns = {
@XmlNs(namespaceURI = "http://www.sat.gob.mx/cfd/3", prefix = "cfdi"),
@XmlNs(namespaceURI = "http://www.w3.org/2001/XMLSchema-instance", prefix = "xsi")
},
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package Controlador;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlSchema;
Les mando saludos y agradecimientos por adelantado.