Problema ao tentar fazer unmarshal em arquivo xml de nota fiscal eletronica

Bom dia amigos,

o que eu estou tenando fazer é pegar um xml e transforma-lo em objeto. Porém não estou coseguindo.

Aqui está o estilo do meu xml.

<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00">
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">...</NFe>
<protNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00">...</protNFe>
</nfeProc>

E aqui está a classe que eu mapiei:

@XmlRootElement(name="nfeProc")
@XmlType(propOrder = { "nFe", "infNfe" })
public class NFiscalEletronica {

	@XmlElement(name="NFe")
	public NFiscalEletr nFe;

	@XmlElement(name="protNFe")
	public InfoNfe infNfe;

	
}

E aqui está a forma como eu estou tentando dar um unmarshal

JaxbUtil jaxb = new JaxbUtil();
nota = (NFiscalEletronica) jaxb.unmarshal(nfe, NFiscalEletronica.class);

Aqui esta JaxbUtil:

public Object unmarshal(File arquivo, Class<? extends Object> classe) throws JAXBException{
		JAXBContext jc = JAXBContext.newInstance(classe);		
		Unmarshaller um = jc.createUnmarshaller();
		return um.unmarshal(arquivo);
	}

Aqui está o erro:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.portalfiscal.inf.br/nfe", local:"nfeProc"). Expected elements are <{}NFe>,<{}ide>,<{}infNFe>,<{}nfeProc>
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:631)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:236)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:231)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105)

Alguém teria uma força ?

Não falta um atributo “namespace” também?

1 curtida

Bom problema resolvido, agradeço a ajuda.

Minha classe ficou assim:

@XmlRootElement(name="nfeProc",namespace="http://www.portalfiscal.inf.br/nfe")
@XmlType(propOrder = { "nFe", "infNfe" })
@XmlAccessorType(XmlAccessType.FIELD)
public class NFiscalEletronica {

	@XmlElement(name="NFe")
	public NFiscalEletr nFe;

	@XmlElement(name="protNFe")
	public InfoNfe infNfe;

	@XmlAttribute
	public String versao;
	
	@XmlAttribute
	public String xmlns;

	public NFiscalEletr getnFe() {
		return nFe;
	}

	public void setnFe(NFiscalEletr nFe) {
		this.nFe = nFe;
	}

	public InfoNfe getInfNfe() {
		return infNfe;
	}

	public void setInfNfe(InfoNfe infNfe) {
		this.infNfe = infNfe;
	}

	public String getVersao() {
		return versao;
	}

	public void setVersao(String versao) {
		this.versao = versao;
	}

	public String getXmlns() {
		return xmlns;
	}

	public void setXmlns(String xmlns) {
		this.xmlns = xmlns;
	}

	
	
}

Bom pessoal,

ocorre um pequeno problema agora. Ele faz a conversão de boa, porém os objetos que estão relacionados ao @XmlRoot vem nulos.

Exemplo:

nota.getnFe().getInfoNfe().getIde().getCodNotaFiscal()

Eu sei que é pq ninguém foi instanciado ou não foi feito nenhuma injeção de dependencia.

E então como resolvo ?

Ninguém ?

Ninguém ?