XStream na NF-e, duvida de cabeçalho [RESOLVIDO]

8 respostas
L

Olá, boa tarde a todos…
O esquema é o seguinte…estou usando XStream para escrever meu arquivo de envio da NF-e, até ae blz…
Mas não consigo fazer corretamente, ou seja, sem qq tipo de gambiarras estas linhas…

<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
  <infNFe Id="NFe35080599999090910270550010000000015180051273" versao="1.10">
// demais campos, atributos e tal..

// e no final do arquivo
  </infNfe>
</NFe>

Queria q ele entendesse que fazem parte do XML, ficam no cabeçalho, porém se eu criar a classe NFe e outra infNFe, e dentro delas seus respectivos atributos, o resultado é este…

<NFe>
   <xmlns>"http://www.portalfiscal.inf.br/nfe"></xmlns>
</NFe>
 <infNFe>
   <Id>"NFe35080599999090910270550010000000015180051273"</Id>
   <versao>"1.10"</versao>
</intNFe>

// e aqui o resto do código..

Alguma sugestão de como fazer isso? É melhor ao invés de usar o XStream, usar outra ferramenta para isso? Por exemplo, o JAXB?

Fico no aguardo…
Muito obrigado…qq ajuda, dica é muito benvinda.

Abraços, Léo.

8 Respostas

L

é só usar a anotação @XStreamAsAttribute em cima do Id e versão que vc corrige isso…

sobre a opção de JABX ou Xstream a minha opinião é… se tiver tempo e paciência o Xstream é mais elegante… um código mais limpo e intuivo… porem com JABX vc pode gerar as classes apartir dos XSD’s o que é muito mais rápido…

agora vc escolhe o que achar melhor…

até

L

Ok, era isso mesmo viu…

Agora peguei pra ver o JAXB tb…me pareceu legal.
Vc tem algum exemplo de geração do XML, baseado nele, pois já fiz a conversão dos XSDs…agora queria usar o q foi gerado.
Tem algum exemplo?

Obrigado.

L

Tipo vc vai só setando os dados

Nfe nfe = new Nfe();
nfe.setparametroX('teste');

ao no final de tudo vc faz o marshaller

javax.xml.bind.JAXBContext jaxbCtx = javax.xml.bind.JAXBContext.newInstance(nfe.getClass().getPackage().getName());
javax.xml.bind.Marshaller marshaller = jaxbCtx.createMarshaller();
marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

marshaller.marshal(nfe, System.out);

blz?

L

É isso mesmo, vc está me ajudando muito mesmo…
Fiz como vc citou no exemplo, veja como ficou a minha classe

public static void main(String[] args) throws IOException {
	   TNFe nfe = new TNFe();
	   InfNFe infNfe = new InfNFe();
	   infNfe.setId("LEO123");
	   infNfe.setVersao("1.10");
	   nfe.setInfNFe(infNfe);  
	   

	   try {
		   JAXBContext jaxbCtx = JAXBContext.newInstance(nfe.getClass().getPackage().getName());

		   Marshaller marshaller = jaxbCtx.createMarshaller();  
		   marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);  

		   marshaller.marshal(nfe, System.out);  

	   } catch (JAXBException e) {
		   e.printStackTrace();
	   }  
	}

Porém ao executar, apresenta o seguinte erro:

Vc sabe o q pode estar errado?
O q quero é apenas gerar um arquivo XML, baseado nas classes geradas a partir do JAXB, e dos XSDs…

QQ ajuda é muito benvinda.

Grato.

L

Ah, segue em anexo…o arquivo com a classe TNFe q estou usando no exemplo acima.

Obrigado.

L

Cara vc tem que anotar a TNfe com esse @XmlRootElement se não me engano da seguinte maneira… não tenho certeza agora…

se não conseguir dá um toque que amanhã eu repondo…

flw

L

Pois é…pode ser isso, mas gerei minhas classes, baseados nos XSDs do SEFAZ, e sendo assim era para estarem corretos né?..rs Acho eu…

Enfim, num deu certo ainda, se tiver alguma outra dica, agradeço muito…

Abraços…

L

Bom dia a todos…
Então, deu certo o esquema q vc me falou mesmo, era isso ae…hj fiz com mais calma e veja como ficou…

Bastou editar a minha classe TNFe e logo acima da inicialização dela colocar essa anotação, conforme vc tinha dito…

@XmlRootElement(name="NFe") 
public class TNFe {
...

Obrigado…por hora é só!..rsrs

Criado 15 de outubro de 2009
Ultima resposta 16 de out. de 2009
Respostas 8
Participantes 2