Exemplo de codigo para ler o XML da NFE e carregar em tabelas SQL (CONSEGUI OBRIGADO!)

3 respostas
L

Olá,
eu uso aqui na empresa a linguagem centura 1.5 que não tem suporte para XML.
Então eu gostaria de fazer um programa em java que eu passase, via linha de comando, o nome e caminho do arquivo e usuario e senha do banco de dados e este programa iria ler o xml e jogar os dados em tabelas no banco de dados sybase via jdbc. eu não tenho ferramenta alguma que ajude na programação java aqui tenho só o textpad como editor de texto. e não precisa ser um exemplo orientado a objeto não. é algo batch mesmo!!!

se vocês puderem me ajudar com exemplos de código para esta tarefa eu fico muito grato!!!

obrigado
Luc

bom o xml ta no anexo e as tabelas seriam as abaixo

CREATE TABLE NFE_INFNFE
(
infNFed char(44) NULL,
nr_Recibo char(44) NULL
)

CREATE TABLE NFE_EMIT
(
infNFed char(44) NULL,
CNPJ char(14) NULL,
xNome char(60) NULL,
xFant char(60) NULL,
xLgr char(60) NULL,
nro char(60) NULL,
xBairro char(60) NULL,
cMun char(7) NULL,
xMun char(60) NULL,
UF char(2) NULL,
CEP numeric(8) NULL,
cPais numeric(4) NULL,
xPais char(60) NULL,
fone numeric(10) NULL,
IE char(14) NULL
)

CREATE TABLE NFE_DEST
(
infNFed char(44) NULL,
CNPJ char(14) NULL,
xNome char(60) NULL,
xLgr char(60) NULL,
nro char(60) NULL,
xBairro char(60) NULL,
cMun char(7) NULL,
xMun char(60) NULL,
UF char(2) NULL,
CEP numeric(8) NULL,
cPais numeric(4) NULL,
xPais char(60) NULL,
fone numeric(10) NULL,
IE char(14) NULL,
ISUF char(9) NULL
)
go

CREATE TABLE NFE_DET_NITEM
(
infNFed char(44) NULL,
det_nItem numeric(3) NULL,
cProd char(60) NULL,
xProd char(120) NULL,
NCM char(8) NULL,
EXTIPI char(3) NULL,
genero numeric(2) NULL,
CFOP numeric(4) NULL,
uCom char(6) NULL,
qCom numeric(12,4) NULL,
vUnCom numeric(16,4) NULL,
vProd numeric(15,2) NULL,
uTrib char(6) NULL,
qTrib numeric(12,4) NULL,
vUnTrib numeric(16,4) NULL,
ICMS_orig numeric(1) NULL,
ICMS_CST numeric(2) NULL,
ICMS_modBc numeric(2) NULL,
IPI_cEnq char(5) NULL,
IPI_CST char(2) NULL,
PIS_CST char(2) NULL,
CONFINS_CST char(2) NULL
)
go

CREATE TABLE NFE_DET_TOTAL
(
infNFed char(44) NULL,
vBC numeric(15,2) NULL,
vICMS numeric(15,2) NULL,
vBCST numeric(15,2) NULL,
vST numeric(15,2) NULL,
vProd numeric(15,2) NULL,
vFrete numeric(15,2) NULL,
vSeg numeric(15,2) NULL,
vDesc numeric(15,2) NULL,
vII numeric(15,2) NULL,
vIPI numeric(15,2) NULL,
vPIS numeric(15,2) NULL,
vCONFINS numeric(15,2) NULL,
vOutro numeric(15,2) NULL,
vNF numeric(15,2) NULL
)
go

CREATE TABLE NFE_DET_TRANSP
(
infNFed char(44) NULL,
CNPJ char(14) NULL,
xNome char(60) NULL,
IE char(14) NULL,
xLgr char(60) NULL,
xEnder char(60) NULL,
xMun char(60) NULL,
UF char(2) NULL,
qVol numeric(15) NULL,
esp char(60) NULL,
pesoL numeric(15,3) NULL,
pesoB numeric(15,3) NULL
)
go

3 Respostas

Q

Faz o download do eclipse tio e use o jdom para passar estes valores do xml para o banco. 8)

L

Obrigado cara!!!

você tem ai algum tutorial ou codigo mais completo do jdom? os exemplos que achei são somente parciais eles sub entendem que o cara ja é um programador java e ja sabe o que fazer com o trecho do codigo!

Obrigado

Luc

L

Consegui fazer!!!

Comprei a revista mundo java deste mês (vi o anuncio no bunner aqui no alto da pagina) que tem um exemplo completo do JDOM.

só que quando adaptei para o arquivo da NFE não leu e não deu erro algum. Revi todo o código e nada. Aí comparando os arquivos do exemplo da revista e o xml monstro da NFE percebi que o da NFE tinha um namespace no inicio e achei na api do jdom uma classe namespace. Procurei no google e achei como usar a classe e bingo funcionou!!!

não sou programador java mas acho que até que me virei bem pois ler xml com fileopen ninguém merece não é?

segue abaixo o código que montei e esta rodando para minha necessidade!!!

são 3 arquivos

public class Nfe {

	private String id;
	private String versao;
	private String no;
	private String campo;
	private String valor;

    public Nfe(String i, String ver, String n, String c, String val) {
		setId(i);
		setVersao(ver);
		setNo(n);
		setCampo(c);
		setValor(val);
	}

	public void setId (String id) {
		this.id = id;
	}
	public String getId() {
		return id;
	}

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


	public void setNo (String no) {
		this.no = no;
	}
	public String getNo() {
		return no;
	}

	public void setCampo (String campo) {
		this.campo = campo;
	}
	public String getCampo() {
		return campo;
	}

	public void setValor (String valor) {
		this.valor = valor;
	}
	public String getValor() {
		return valor;
	}

}
import java.sql.Connection;
import java.sql.DriverManager;
import java.lang.Class;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collection;

public class NfeDAO
{

	static
	{

		try
		{
			Class.forName("com.sybase.jdbc2.jdbc.SybDriver");
		}

		catch(ClassNotFoundException ex)
		{
			// força um erro para repassar...
			throw new RuntimeException(ex);
		}
	}

	public Connection getConexao() throws SQLException
	{

		Connection con = null;

		try {

			Class.forName("com.sybase.jdbc2.jdbc.SybDriver");
			con = DriverManager.getConnection("jdbc:sybase:Tds:43.129.42.207:6000/db_dwh02","luciano_mello","123456");

		}
		catch(ClassNotFoundException ex) {
			// força um erro para repassar...
			throw new RuntimeException(ex);
		}

		return con;
	}

	// INSERT
	public void setNfe(Nfe nfe) throws SQLException {
		String sql = new String();

		sql  = "insert into db_dwh02..NFE_XML (id, versao, no, campo, valor) values ( ";
		sql += 	"'" + nfe.getId() 		+ "',";
		sql += 	"'" + nfe.getVersao() 	+ "',";
		sql += 	"'" + nfe.getNo() 		+ "',";
		sql += 	"'" + nfe.getCampo() 	+ "',";
		sql += 	"'" + nfe.getValor() 	+ "')";

//		System.out.println(sql);

		Connection con = getConexao();
		Statement stmt = con.createStatement();
		stmt.executeUpdate(sql);
		stmt.close();
		con.close();
	}

	// SELECT
	public Collection getNfes() throws SQLException {
		String sql = new String();

		sql =  "select id, versao, no, campo, valor from db_dwh02..NFE_XML";

		Connection con = getConexao();
		Statement stmt = con.createStatement();
		ResultSet rs   = stmt.executeQuery(sql);

		ArrayList Nfes = new ArrayList();

		while( rs.next() ){
			String id   	= rs.getString("id");
			String versao  	= rs.getString("versao");
			String no		= rs.getString("no");
			String campo	= rs.getString("campo");
			String valor	= rs.getString("valor");

			Nfe nfe = new Nfe(id, versao, no, campo, valor);
			Nfes.add(nfe);

		}

		rs.close();
		stmt.close();
		con.close();

		return Nfes;
	}

}
import java.io.*;
import java.util.*;

import org.jdom.*;
import org.jdom.filter.ElementFilter;
import org.jdom.input.*;
import org.jdom.output.*;

public class NfeXmlReader{

	public static void main(String[] args)
  	{
		//Aqui você informa o nome do arquivo XML.
		File f = new File(args[0]);

		//Criamos uma classe SAXBuilder que vai processar o XML
		SAXBuilder sb = new SAXBuilder();

		try
		{
			//Este documento agora possui toda a estrutura do arquivo.
			Document d = sb.build(f);

			//Recuperamos o elemento root
			Element nfe = d.getRootElement();

			//o arquivo da nfe possui um name space então é necessario um objeto para representa-lo
			Namespace ns = Namespace.getNamespace("http://www.portalfiscal.inf.br/nfe");

			// navego dentro da arvore do documento criando variaveis para representar os elementos do arquivo
			Element infNFe = (Element) nfe.getChild("infNFe", ns);

			// este não tem namespace
			String idNfe 		= infNFe.getAttributeValue("Id");
			String versaoNfe 	= infNFe.getAttributeValue("versao");

			//Recuperamos uma lista de elementos filhos (children) dentro do elemento
			List elements = infNFe.getChildren();

			// criamos um interator para podermos fazer um loop pelos elementos da lista
			Iterator i = elements.iterator();

			//Iteramos pelos elementos filhos
			while (i.hasNext())
			{
				Element element = (Element) i.next();

				String no  	  	= element.getName();

				String item	= element.getAttributeValue("nItem");

				if (item != null)
				{
					no = no + " - Item = " + item;

				}

				loopNfe(element, no, idNfe, versaoNfe);

			}

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

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

		}catch (Exception ex) {
			ex.printStackTrace();
		}
	}


	public static void loopNfe(Element nfe_no, String no, String idNfe, String versaoNfe)
	{
		//Recuperamos uma lista de elementos filhos (children) dentro do elemento
		List elements = nfe_no.getChildren();

		if(elements.isEmpty())
		{

			Nfe nfeVO = MontaNfe(nfe_no, no, idNfe, versaoNfe);
			GravaNfe( nfeVO );

		}
		else
		{
			// criamos um interator para podermos fazer um loop pelos elementos da lista
			Iterator i = elements.iterator();

			//Iteramos pelos elementos filhos
			while (i.hasNext())
			{
				Element element = (Element) i.next();

				loopNfe(element, no, idNfe, versaoNfe);

			}

		}

	}

	public static Nfe MontaNfe(Element element, String no, String idNfe, String versaoNfe)
	{

		String campo  = element.getName();
		String valor  = element.getText();

		Nfe nfeVO = new Nfe(idNfe, versaoNfe, no, campo, valor);

		return nfeVO;

	}


	public static void GravaNfe(Nfe nfeVO)
	{
		try
		{
			NfeDAO dao = new NfeDAO();
			dao.setNfe(nfeVO);

		}catch (Exception ex) {
			ex.printStackTrace();
		}
	}

}
Criado 29 de julho de 2009
Ultima resposta 6 de ago. de 2009
Respostas 3
Participantes 2