Recuperar elemento de um xml simples (sem o elemento nameSpace - NF-e)

1 resposta
J

Este post na verdade é uma simplificação do que fiz em Janeiro deste Ano, tendo em vista que algumas dúvidas surgiram em relação ao post original.

Link do post original: http://www.guj.com.br/java/261084-leitura-de-xml-de-nfe-com-jdom

import java.io.File;

import javax.swing.JOptionPane;

import org.jdom.Document;

import org.jdom.Element;

import org.jdom.input.SAXBuilder;

import org.jdom.xpath.XPath;

/*

  • Desenvolvido por Fabiano Costa de Alvarenga

  • Esta classe recupera de um XML de NF-e, sem nameSpace, os

  • seguintes dados:

  • Tem como métodos:

  • getDestinatarioNFe() - String:destinatário
    */
    public class LeitorXML {

    /*

    • NF = /nfeProc/NFe/infNFe/ide/nNF
    • Emissao = /nfeProc/NFe/infNFe/ide/dEmi
    • Destinatario = /nfeProc/NFe/infNFe/dest/xNome
    • E-mail = /nfeProc/NFe/infNFe/dest/email
    • Chave NFe = /nfeProc/NFe/infNFe
    • Emitente = /nfeProc/NFe/infNFe/Emit/xNome
      */

    private SAXBuilder sb;
    private Document d;

    public LeitorXML(String arquivo) {
    
    // TODO Auto-generated constructor stub
    
    try {
    
    sb = new SAXBuilder();
    
    d = sb.build(new File(arquivo));
    
    } catch (Exception e) {
    
    // TODO: handle exception
    
    JOptionPane.showMessageDialog(null, "Exceção ao processar arquivo! "+e.getMessage());
    
    return;
    
    }
    
    }
    
    // Crie um método get para cada elemento que queira extrair do xml.
    
    // Obs.: Existem outras formas mais elegantes de fazer, mas como eu não precisava
    
    // retornar todos os elementos do xml, e sim 5 informações apenas, por isso preferi fazer
    
    // desta forma.
    
    public String getDestinatarioNFe(){
    
    try {
    
    XPath xPath = XPath.newInstance("//nfeProc/NFe/infNFe/dest/xNome");
    
    Element node = (Element) xPath.selectSingleNode(d.getRootElement());
    
    return node.getText();
    
    } catch (Exception e) {
    
    System.out.println("Erro ao processar arquivo! "+e.getMessage());
    
    return null;
    
    }
    
    }
    
    }
    

Segue abaixo a classe para testar o código acima.

public class Teste {

private static LeitorXML leitorXML;

public static void main(String[] args) {
	
	leitorXML = new LeitorXML("C:/DevelopmentSystem/teste/src/xmlTeste.xml");
			
	System.out.println("Nome do destinatário no XML: "+leitorXML.getDestinatarioNFe());

}

}

Pessoal, espero ter colaborado, qualquer dúvida fiquem a vontade para entrarem em contato.

1 Resposta

Z

Olá Fabiano,

Obrigado pelo Post, nós estamos tentando ler os dados de NFe e seu post foi o que mais nos
ajudou a fazer a leitura…porémTive que alterar a linha :
XPath xPath = XPath.newInstance("//nfeProc/NFe/infNFe/dest/xNome");

Para
XPath xPath = XPath.newInstance("//k:nfeProc/k:NFe/k:infNFe/k:dest/k:xNome");
Como você fez no primeiro exemplo.

Agora estamos tentando pegar a chave da nota fiscal, mas sem sucesso,

Tentei alterar a linha
XPath xPath = XPath.newInstance("//k:nfeProc/k:NFe/k:infNFe/k:dest/k:xNome");

para
XPath xPath = XPath.newInstance("//k:nfeProc/k:NFe/k:infNFe");

Mas pelo jeito não é somente isso, é muito complicado mudar o código para buscar a chave da NF?

Agradeço qualquer auxilio…

Roberto

Criado 4 de abril de 2012
Ultima resposta 23 de ago. de 2012
Respostas 1
Participantes 2