[RESOLVIDO] Efetuar a Leitura de arquivos XML

29 respostas
C

Bom dia à todos,

Obtive o recebimento de um arquivo XML contendo todas as informações do banco do cliente, porém em nossos programas, só suportamos arquivos “.mdb”, “.dbf” ou “.csv”…
Ou seja, o arquivo é extenso, sabendo-se que não obtive sucesso na maioria dos leitores de arquivos XML que tentei abrir, onde tenho por motivo exportar esse arquivo XML para outro banco de dados, dê preferência para o Access…

Fiz a importação do arquivo XML diretamente no Access, porém foram criadas diversas tabelas, onde preciso referenciar as tabelas, sabendo-se que não há um identificador, como chave primária e secundária…

Vou postar um trecho do arquivo XMLm referente as informações de um registro, para que vocês possam visualizar…

<?xml version="1.0" encoding="ISO-8859-1" ?> <Dados> <DadosAssinante> <IdAssinante>XXXXX</IdAssinante> <CodigoAssinante>XXXX</CodigoAssinante> <NomeAssinante>XXXXX XXXX XXXXXX</NomeAssinante> <CpfCnpj>XXXXXXXXXXX</CpfCnpj> <RgIe>XXXXXXXXXX</RgIe> <LogradouroResidencial>XXX XXXXXX XX XXXX XXXXX</LogradouroResidencial> <NumeroResidencial>XXXX</NumeroResidencial> <AptoSala></AptoSala> <Bloco></Bloco> <Edificio></Edificio> <ComplementoResidencial></ComplementoResidencial> <BairroResidencial>XXXXXX</BairroResidencial> <CidadeResidencial>XXXXX</CidadeResidencial> <UfResidencial>XX</UfResidencial> <QtdeBoletosVencidos>X</QtdeBoletosVencidos> <IdentificadorDebito>XXXXXXXXXX</IdentificadorDebito> <TermoQuitacaoDebito>X</TermoQuitacaoDebito> <DadosCobranca> <LogradouroCobranca>XX XXXX XXX XX XXXXX</LogradouroCobranca> <NumeroCobranca>XXXX</NumeroCobranca> <ComplementoCobranca></ComplementoCobranca> <CepCobranca>XXXXXXXXX</CepCobranca> <CidadeCobranca>XXXXX</CidadeCobranca> <UfCobranca>XX</UfCobranca> <QtdeRevista>X</QtdeRevista> <DadosBoleto> <NossoNumero>XXXXX</NossoNumero> <NumeroDocumento>XXXXXX-X/X-XX</NumeroDocumento> <DataVencimento>XX/XX/XXXX</DataVencimento> <ValorDocumento>XX.X</ValorDocumento> <ValorDesconto>X</ValorDesconto> <ValorMulta>X</ValorMulta> <ValorJuros>X</ValorJuros> <ValorOutrasDeducoes>X</ValorOutrasDeducoes> <ValorOutrosAcrescimos>X</ValorOutrosAcrescimos> <NumeroBanco>XXX</NumeroBanco> <AgenciaBanco>XXXX.X</AgenciaBanco> <ContaCorrente>XXXXXXXX-X</ContaCorrente> <CodCedenteConvenio>XXXXX</CodCedenteConvenio> <TipoLayout></TipoLayout> <NomeCedente>XXXX XXXXXXX XX XXXXXXXXXX XXXXXXXXX XXXX CNPJ XX.XXX.XXX/XXXXX-XX</NomeCedente> <DataDocumento>XX/XX/XXXX</DataDocumento> <TipoBoleto>X</TipoBoleto> <IndicadorJuros>X</IndicadorJuros> <Juros> X,XXXXXXXXX</Juros> <DiasCorridosJuros>XX</DiasCorridosJuros> <IndicadorMulta>XX</IndicadorMulta> <Multa> X,XXXXXXX</Multa> <DiasCorridosMulta>XX</DiasCorridosMulta> <DadosContrato> <NumContrato>XXXX</NumContrato> <LogradouroConexao>XXXX XXXXX XXX XXXX XXXXX</LogradouroConexao> <NumeroConexao>XXXX</NumeroConexao> <AptoSalaConexao></AptoSalaConexao> <BlocoConexao></BlocoConexao> <EdificioConexao></EdificioConexao> <ComplementoConexao></ComplementoConexao> <BairroConexao>XXXXX</BairroConexao> <CepConexao>XXXXXXXXX</CepConexao> <CidadeConexao>XXXXXX</CidadeConexao> <UfConexao>XXX</UfConexao> </DadosContrato> <DadosAtendimentos> <NumAtendimento>XXXXXXXXXXXXXXXXXXX</NumAtendimento> <NumAtendimento>XXXXXXXXXXXXXXXXXXX</NumAtendimento> <NumAtendimento>XXXXXXXXXXXXXXXXXXX</NumAtendimento> <NumAtendimento>XXXXXXXXXXXXXXXXXXX</NumAtendimento> <NumAtendimento>XXXXXXXXXXXXXXXXXXX</NumAtendimento> </DadosAtendimentos> <MensagemAdicionais> <Descricao>Empresa Optante pelo Simples Nacional, não dá direito a reter o ICMS</Descricao> <Descricao>Teste 1</Descricao> <Descricao>Teste 2</Descricao> <Descricao>teste 3</Descricao> <Descricao>teste 4</Descricao> <Descricao>teste 5</Descricao> <Descricao>teste 6</Descricao> <Descricao>teste 7</Descricao> <Descricao>teste 8</Descricao> <Descricao>teste 9</Descricao> <Descricao>teste 10</Descricao> <Descricao>teste 11</Descricao> <Descricao>teste 12</Descricao> <Descricao>teste 13</Descricao> <Descricao>teste 14</Descricao> </MensagemAdicionais> <ItensBoleto> <ItenBoleto> <CodigoItem>XXXXXXXXXXXXXXXXXXX-X</CodigoItem> <DescricaoItem>SCM-[XX/XX/XXXX-XX/XX/XXXX]</DescricaoItem> <ValorItem>XX</ValorItem> </ItenBoleto> <ItenBoleto> <CodigoItem>XXXXXXXXX-X</CodigoItem> <DescricaoItem>Fibra 1MB-[XX/XX/XXXX-XX/XX/XXXX]</DescricaoItem> <ValorItem>XX.X</ValorItem> </ItenBoleto> </ItensBoleto> <NotaFiscal> <IdNota>XXXXXXXXX</IdNota> <RazaoSocial>XXXXXXXXX XXXXXXXXX de XXXXXXXXX XXXXXXXXX Ltda</RazaoSocial> <Cnpj>XXXXXXXXX.XXXX/XXXXX-XX</Cnpj> <InscEstadual>XXXX.XX.XXX.XXX</InscEstadual> <Endereco>XXXXXXXXX XXXXXXXXX</Endereco> <NumeroEndereco>XXXXXXXXX</NumeroEndereco> <Bairro>XXXXXXXXX XXXXXXXXX</Bairro> <Cep>XXXXXXXXX</Cep> <Cidade>XXXXXXXXX</Cidade> <Uf>XXXXXXXXX</Uf> <Telefone>XXXXXXXXX-XXXXXXXXX XXXXXXXXX</Telefone> <CallCenter></CallCenter> <Tipo>XXXXXXXXX</Tipo> <Modelo>XXXXXXXXX</Modelo> <Serie>XXXXXXXXX</Serie> <Numero>XXXXXXXXX</Numero> <DataEmissao>XXXXXXXXX/XXXXXXXXX/XXXXXXXXX</DataEmissao> <MesReferencia>XXXXXXXXX/XXXXXXXXX</MesReferencia> <PeriodoPrestacao>XXXXXXXXX</PeriodoPrestacao> <Cfop>XXXXXXXXX</Cfop> <IdentificadorDigital>XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX</IdentificadorDigital> <ValorTotal> XXXXXXXXX,00</ValorTotal> <BaseIcms> XXXXXXXXX,00</BaseIcms> <ValorIcms> XXXXXXXXX,00</ValorIcms> <ValorIss>XXXXXXXXX</ValorIss> <ValorPis> 0,XXXXXXXXX</ValorPis> <ValorCofins> 0,XXXXXXXXX</ValorCofins> <ValorFust> 0,XXXXXXXXX</ValorFust> <ValorFuntel> 0,XXXXXXXXX</ValorFuntel> <ItensNotaFiscal> <ItenNotaFiscal> <CodigoItem>XXXXXXXXX-XXXXXXXXX</CodigoItem> <DescricaoItem>SCM-[XX/XX/XXXX-XX/XX/XXXX]</DescricaoItem> <ValorItem>XXXXXXXXX</ValorItem> <BaseIcms>XXXXXXXXX</BaseIcms> <AliquotaIcms>XXXXXXXXX</AliquotaIcms> <ValorIcms>XXXXXXXXX</ValorIcms> <AliquotaIss>XXXXXXXXX</AliquotaIss> <ValorIss>XXXXXXXXX</ValorIss> <ValorPis>0.XXXXXXXXX</ValorPis> <ValorCofins>0.XXXXXXXXX</ValorCofins> <ValorFust>0.XXXXXXXXX</ValorFust> <ValorFuntel>0.XXXXXXXXX</ValorFuntel> </ItenNotaFiscal> </ItensNotaFiscal> </NotaFiscal> <NotaFiscal> <IdNota>XXXXXXXXX</IdNota> <RazaoSocial>XXXXXXXXX XXXXXXXXX XXXXXXXXX XXXXXXXXX XXXXXXXXX Ltda</RazaoSocial> <Cnpj>XX.XXX.XXXX/XXXXX-XX</Cnpj> <InscEstadual>XXX.XX.XXX.XXX</InscEstadual> <Endereco>XXX XXXXXXXXX</Endereco> <NumeroEndereco>XXXXXXXXX</NumeroEndereco> <Bairro>XXXXXXXXX XXXXXXXXX</Bairro> <Cep>XXXXXXXXX</Cep> <Cidade>XXXXXXXXX</Cidade> <Uf>XXXXXXXXX</Uf> <Telefone>XXXXXXXXX-XXXXXXXXX XXXXXXXXX</Telefone> <CallCenter></CallCenter> <Tipo>XXXXXXXXX</Tipo> <Modelo>XXXXXXXXX</Modelo> <Serie>XXXXXXXXX</Serie> <Numero>XXXXXXXXX</Numero> <DataEmissao>XX/XX/XXXX</DataEmissao> <MesReferencia>XX/XXXX</MesReferencia> <PeriodoPrestacao>XX</PeriodoPrestacao> <Cfop>XXXX</Cfop> <IdentificadorDigital>XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX</IdentificadorDigital> <ValorTotal> XXXXXXXXX,XXXXXXXXX</ValorTotal> <BaseIcms> 0,00</BaseIcms> <ValorIcms> 0,00</ValorIcms> <ValorIss> 0,XXXXXXXXX</ValorIss> <ValorPis> XXXXXXXXX,XXXXXXXXX</ValorPis> <ValorCofins> 0,XXXXXXXXX</ValorCofins> <ValorFust> XXXXXXXXX,00</ValorFust> <ValorFuntel> 0,XXXXXXXXX</ValorFuntel> <ItensNotaFiscal> <ItenNotaFiscal> <CodigoItem>XXXXXXXXX</CodigoItem> <DescricaoItem>Fibra 1MB-[XX/XX/XXXX-XX/XX/XXXX]</DescricaoItem> <ValorItem>XX.X</ValorItem> <BaseIcms>0</BaseIcms> <AliquotaIcms>0</AliquotaIcms> <ValorIcms>0</ValorIcms> <ValorIss>0</ValorIss> <ValorPis>0.0</ValorPis> <ValorCofins>0.0</ValorCofins> <ValorFust>0</ValorFust> <ValorFuntel>0</ValorFuntel> </ItenNotaFiscal> </ItensNotaFiscal> </NotaFiscal> <InstrucaoBoleto> <Descricao>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</Descricao> <Descricao>Instrução Linha 3</Descricao> <Descricao>Instrução Linha 4</Descricao> <Descricao>Instrução Linha 5</Descricao> </InstrucaoBoleto> </DadosBoleto> </DadosCobranca> </DadosAssinante>

Conto com a colaboração de vocês.
Desde já Agradeço, Eduardo.

29 Respostas

romarcio

O melhor é entrar em contato com quem te mando esse XML e pedir a eles o XSD referente a esse XML. Para saber o tipo de cada campo (string, int, float, …), tamanho do campo, se é obrigatório ou não, …, coisas desse tipo.

C

Valeu pela dica Romarcio,

Porém com o arquivo XSD, o que facilitaria no meu caso?
Como conseguiria migrar essas informações para um banco SQL?

Att, Eduardo Pereira

nel

cajubino:
Valeu pela dica Romarcio,

Porém com o arquivo XSD, o que facilitaria no meu caso?
Como conseguiria migrar essas informações para um banco SQL?

Att, Eduardo Pereira

Simplesmente tudo. Com o XSD em mãos, você pode gerar uma classe Java que representaria o seu modelo XML.
Dessa forma, você iria trabalhar diretamente no XML e isso facilitaria e muito sua vida. Sem falar, que desse modo, se usar JPA por exemplo, pode simplesmente mandar persistir o objeto. Resumindo, recebe o XML e realiza um parsers direto para um Object.

C

nel, agradeço as informação.

Conforme vim pesquisando, meus objetivos obtiveram outro rumo, ou seja, estou criando uma classe que faça a leitura do arquivo XML recebido..

Exemplo:

package arquivosxml;

import java.io.*;

import java.util.Iterator;
import java.util.List;
import org.jdom.*;
import org.jdom.input.SAXBuilder;

 

public class LerXML {

 

public static void main(String[] args) throws IOException, JDOMException {
 //Aqui você informa o nome do arquivo XML.   
   File f = new File("c:/arquivo.xml");   
  
   //Criamos uma classe SAXBuilder que vai processar o XML4   
   SAXBuilder sb = new SAXBuilder();   
  
   //Este documento agora possui toda a estrutura do arquivo.   
   Document d = sb.build(f);   
  
   //Recuperamos o elemento root   
   Element agenda = d.getRootElement();   
   //Recuperamos os elementos filhos (children)   
   List elements = agenda.getChildren();   
   Iterator i = elements.iterator();   
  
   //Iteramos com os elementos filhos, e filhos do dos filhos   
   while (i.hasNext()) {   
      Element element = (Element) i.next();   
      System.out.println("Código:"+ element.getAttributeValue("id"));
      System.out.println("nome:"+ element.getChildText("nome")); 
      System.out.println("Telefone:"+ element.getChildText("telefone"));   
      System.out.println("Endereço:"+ element.getChildText("endereco"));   
      System.out.println("E-mail:"+ element.getChildText("email"));
      
   }  



}


}

Segue abaixo o XML Correspondente..:

<?xml version="1.0" encoding="UTF-8"?>
<Agenda>
<contato id="2">
<nome>2</nome>
<telefone>2</telefone>
<endereco>2</endereco>
<email>2</email>
<sub>
<sub1>sub1</sub1>
<sub2>sub2</sub2>
<sub3>sub3</sub3>
</sub>
</contato>
<contato id="4">
<nome>4</nome>
<telefone>4</telefone>
<endereco>4</endereco>
<email>4</email>
<sub>
<sub1>sub1</sub1>
<sub2>sub2</sub2>
<sub3>sub3</sub3>
</sub>
</contato>
<contato id="6">
<nome>6</nome>
<telefone>6</telefone>
<endereco>6</endereco>
<email>6</email>
<sub>
<sub1>sub1</sub1>
<sub2>sub2</sub2>
<sub3>sub3</sub3>
</sub>
</contato>
</Agenda>

Beleza, estou conseguindo efetuar a leitura, porém a minha dificuldade está em poder efetuar a leitura da tag de meu XML, como poderei fazer isso?

nel

Cara, use um xStream ou JAXB e faça a conversão para um Object, será muito mais fácil e simples para você. O JAXB tem os métodos marshall e unmarshall.

Bom, respondendo sua pergunta, você terá que pegar um filho do nó correspondente. Como postou, é filho do nó , então, terá que pegar o nó primeiro e posteriormente seu filho, ou seja, . Só que isso vai te exigir inúmeras validações, se existe o nó e etc.

C

Este está sendo o meu primeiro contato com XML, levando em consideração que tenho conhecimento básico em Java, sabendo-se que tenho interesse em ampliar meu conhecimento em XML com ênfase em XStream.

Porém de acordo com o que me falou, como representaria isso no código?

ou seja, para efetuar a leitura da id…

element.getAttributeValue("id");

para efetuar a leitura dos outros elementos

element.getChildText("nome"));

e para efetuar a leitura dos elementos do nó desta tag?

nel

Prefiro JAXB, mas ok.

Veja:

public static void main(String[] args) throws Exception {
		File f = new File("teste.xml");
		FileInputStream fis = new FileInputStream(f);
		Document xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(fis);
		Element root = xml.getDocumentElement();
		
		NodeList contatos = root.getElementsByTagName("contato");
		for (int index = 0; index < contatos.getLength(); index++) {
			Node tag = contatos.item(index);
			NodeList childrens = tag.getChildNodes();
			for (int i = 0; i < childrens.getLength(); i++) {
				Node no = childrens.item(i);
				if (no.getNodeName().equalsIgnoreCase("sub")) {
					NodeList subsTag = no.getChildNodes();
					for (int pos = 0; pos < subsTag.getLength(); pos++) {
						Node subs = subsTag.item(pos);
						if (subs.getNodeType() == Node.ELEMENT_NODE)
							System.out.println(subs.getNodeName() + " | " + subs.getTextContent());						
					}
				}
			}
		}
	}

Pode ter código mais simples usando Document? Sim, pode. Fiz as pressas mas quis demonstrar todo o trabalho que isso pode gerar.
Se tiver mais filhos, continua o processo. Isso que não fiz todos os if´s necessários, estou confiando e supondo que o XML é sempre no formato apresentado por ti.

Abraços.

romarcio

Se é seu primeiro contato, melhor praticar antes:

3 formas de ler e criar arquivos xml com java:
Manipulando Arquivo XML ? Parte I: API Nativa
Manipulando Arquivo XML ? Parte II: JDOM
Manipulando Arquivo XML ? Parte III: XStream

Se fizer os 3 tutoriais, vai ter uma boa base, escolha um deles, o que seja mais simples para você e seu projeto.

C

Agradecido pelos tutoriais, porém surgiram algumas dúvidas…

Estou criando meu código de acordo com o JDOM, onde me aparentou ser mais prático, porém segundo o tutorial, para a criação das classes que receberação as informações para serem manipuladas(Telefone,Contato,Endereco), não compreendi o funcionamento da declaração abaixo na clase Contato, sabendo-se importei as bibliotecas que foram solicitadas, como java.util.ArrayList/Collection, porém fica acusando mais erros, sugerindo que eu crie as classes lt e gt:

private Collection&lt;Telefone&gt; telefones = new ArrayList&lt;Telefone&gt;();

Att, Eduardo Pereira

C

Desconsiderar a dúvida acima, pois quando postei o código, automaticamente ele corrigiu para mim… ^^

nel

cajubino:
Agradecido pelos tutoriais, porém surgiram algumas dúvidas…

Estou criando meu código de acordo com o JDOM, onde me aparentou ser mais prático, porém segundo o tutorial, para a criação das classes que receberação as informações para serem manipuladas(Telefone,Contato,Endereco), não compreendi o funcionamento da declaração abaixo na clase Contato, sabendo-se importei as bibliotecas que foram solicitadas, como java.util.ArrayList/Collection, porém fica acusando mais erros, sugerindo que eu crie as classes lt e gt:

private Collection&lt;Telefone&gt; telefones = new ArrayList&lt;Telefone&gt;();

Att, Eduardo Pereira

Que erros ? E como ficou sua classe?

C

Compilei e executei o código conforme o tutorial e obtive o seguinte erro:

run:

Exception in thread main org.jdom.IllegalAddException: The Element cannot be added to itself

at org.jdom.ContentList.add(ContentList.java:216)

at org.jdom.ContentList.add(ContentList.java:131)

at java.util.AbstractList.add(AbstractList.java:91)

at org.jdom.Element.addContent(Element.java:832)

at arquivosxml.ClassePrincipal.gerarXML(ClassePrincipal.java:130)

at arquivosxml.ClassePrincipal.main(ClassePrincipal.java:198)

Java Result: 1

CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)
C

CLASSE PRINCIPAL:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package arquivosxml;


import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import java.io.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import org.jdom.Document;
import org.jdom.Element;

/**
 *
 * @author marcio
 */
public class ClassePrincipal {

    public static void salvarArquivo(Document doc) {

        try {
            Writer out = new OutputStreamWriter(new FileOutputStream("c:/arquivo_JDOM.xml"));
            XMLOutputter xout = new XMLOutputter();
            xout.setFormat(Format.getCompactFormat().setEncoding("ISO-8859-1"));
            xout.output(doc, out);
            System.out.println("XML criado com sucesso!");

        } catch (UnsupportedEncodingException e) {
            e.getMessage();
        } catch (IOException e) {
            e.getMessage();
        }

    }
    
    public static void lerXML() throws JDOMException, IOException{
        //Criamos um objeto SAXBuilder
        //para ler o arquivo
        SAXBuilder sb = new SAXBuilder();
        //Criamos um objetvo Document que irá receber o conteúdo do arquivo
        Document doc = sb.build("c:/arquivo_JDOM.xml");
        //Criamos um objeto Element que recebe as tags do XML
        Element elements = doc.getRootElement();
        //Criamos um objeto Contato que receber os valores através de Element
        Contato contato = new Contato();
        contato.setID(Integer.parseInt(elements.getChildText("id")));
        contato.setNOME(elements.getChildText("nome"));
        contato.setEMAIL(elements.getChildText("email"));
        //Criamos um element que recebe a tag Endereco
        Element endElement = elements.getChild("Endereco");
        //Criamos um objeto endereco que recebe os valores do endElement
        Endereco endereco = new Endereco();
        endereco.setID(Integer.parseInt(endElement.getChildText("id")));
        endereco.setbairro(endElement.getChildText("bairro"));
        endereco.setcep(endElement.getChildText("cep"));
        endereco.setcidade(endElement.getChildText("cidade"));
        endereco.setcomplemento(endElement.getChildText("complemento"));
        endereco.setLOGRADOURO(endElement.getChildText("logradouro"));
        endereco.setnumero(Integer.parseInt(endElement.getChildText("numero")));
        //Inserimos no objetvo contato o objeto Endereco
        contato.setENDERECO(endereco);
        //Criamos um lista para receber os objetos Telefone
        List<Telefone> telefones = new ArrayList<Telefone>();
        //Criamos uma lista de Element para receber a tag Telefones
        List<Element> fonesElement = elements.getChild("Telefones").getChildren();
        //Loop em fonesElement para pegar as demais tags
        for( Element fone : fonesElement){
            //Criamos um objeto telefone que receber os valores em cada posição de fonesElement
            Telefone telefone = new Telefone();
            telefone.setID(Integer.parseInt(fone.getChildText("id")));
            telefone.setDdd(Integer.parseInt(fone.getChildText("ddd")));
            telefone.setNumero(Integer.parseInt(fone.getChildText("numero")));
            //Adicionando na lista de Telefones o objeto Telefone
            telefones.add(telefone);            
        }
        //Adicionando no objeto contato a lista de telefones
        contato.setTELEFONES(telefones);
        System.out.println(contato.toString());        
        
    }

    public static void gerarXML(Contato contato) {
        //Criamos o elemento(tag) raiz
        Element tagContato = new Element("Contato");
        //Criamos os elementos que ficam dentro da tag raiz
        Element idContato = new Element("id");
        Element nomeContato = new Element("nome");
        Element emailContato = new Element("email");
        //Inserirmos os valores as tags criadas a cima
        idContato.setText(String.valueOf(contato.getID()));
        nomeContato.setText(contato.getNOME());
        emailContato.setText(contato.getEMAIL());
        //Inserirmos na tag raiz as tags já com valores
        tagContato.addContent(idContato);
        tagContato.addContent(nomeContato);
        tagContato.addContent(emailContato);

        //Criamos a tag Endereço
        Element tagEndereco = new Element("Endereco");
        //Criamos as tags filhas de Endereço
        Element idEnd = new Element("id");
        Element logradouroEnd = new Element("logradouro");
        Element bairroEnd = new Element("bairro");
        Element cepEnd = new Element("cep");
        Element cidadeEnd = new Element("cidade");
        Element complementoEnd = new Element("complemento");
        Element numeroEnd = new Element("numero");
        //Inserimos os valores as tags criadas
        idEnd.setText(String.valueOf(contato.getENDERECO().getID()));
        logradouroEnd.setText(contato.getENDERECO().getLOGRADOURO());
        bairroEnd.setText(contato.getENDERECO().getbairro());
        cepEnd.setText(contato.getENDERECO().getcep());
        cidadeEnd.setText(contato.getENDERECO().getcidade());
        complementoEnd.setText(contato.getENDERECO().getcomplemento());
        numeroEnd.setText(String.valueOf(contato.getENDERECO().getnumero()));
        //Inserirmos na tag Endereço as tags filhas
        tagEndereco.addContent(idEnd);
        tagEndereco.addContent(logradouroEnd);
        tagEndereco.addContent(bairroEnd);
        tagEndereco.addContent(cepEnd);
        tagEndereco.addContent(cidadeEnd);
        tagEndereco.addContent(complementoEnd);
        //Inserimos na tag raiz as tag Endereco
        tagEndereco.addContent(tagEndereco);

        //Criamos a tag Telefones
        Element tagFones = new Element("Telefones");
        //Inserir a lista de telefones
        for (Telefone fone : contato.getTELEFONES()) {
            //Criamos a tag Telefone
            Element tagFone = new Element("Telefone");
            //Criamos as tags de Telefone
            Element idFone = new Element("id");
            Element dddfone = new Element("ddd");
            Element numerofone = new Element("numero");
            //Insere os valores de telefones nas tags referentes
            idFone.setText(String.valueOf(fone.getID()));
            dddfone.setText(String.valueOf(fone.getDdd()));
            numerofone.setText(String.valueOf(fone.getNumero()));
            //Insere as tags de telefone na tag Telefone
            tagFone.addContent(idFone);
            tagFone.addContent(dddfone);
            tagFone.addContent(numerofone);
            //Insere a tag Telefone na tag pai Telefones
            tagFones.addContent(tagFone);
        }

        //Insere atag Telefones na tag raiz
        tagContato.addContent(tagFones);

        //Criamos um objeto Document
        Document doc = new Document();
        //Inserimos no elemento Document a
        //tag raiz com todas as demais tags
        doc.setRootElement(tagContato);

        //Chamaos o método pra salvar o arquivo
        salvarArquivo(doc);
    }

    public static void main(String[] args) {
        Telefone residencial = new Telefone();
        residencial.setID(1);
        residencial.setDdd(5);
        residencial.setNumero(32214512);

        Telefone celular = new Telefone();
        celular.setID(2);
        celular.setDdd(55);
        celular.setNumero(99879885);

        Collection<Telefone> telefones = new ArrayList<Telefone>();
        telefones.add(residencial);
        telefones.add(celular);

        Endereco endereco = new Endereco();
        endereco.setID(11);
        endereco.setLOGRADOURO("Rua dos Javanezes");
        endereco.setbairro("Largo Zero");
        endereco.setcep("97010600");
        endereco.setcidade("Java City");
        endereco.setnumero(65);
        endereco.setcomplemento("Ap.103a");

        Contato contato = new Contato();
        contato.setID(100);
        contato.setNOME("Fulano da Silva");
        contato.setEMAIL("[email removido]");
        contato.setENDERECO(endereco);
        contato.setTELEFONES(telefones);

        gerarXML(contato);
        try {
            lerXML();
        } catch (JDOMException e) {
            e.getMessage();
        } catch (IOException e) {
            e.getMessage();
        }
    }
}

CLASSE CONTATO:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package arquivosxml;


import java.util.ArrayList;  
import java.util.Collection;  


/**
 *
 * @author marcio
 */
public class Contato {
    private int id;
    private String nome;
    private String email;
    private Endereco endereco;
    private Collection<Telefone> telefones = new ArrayList<Telefone>();
    
    void setID(int id){
        this.id=id;
    }
    
    void setNOME(String nome){
        this.nome=nome;
    }
    
    void setEMAIL(String email){
        this.email=email;
    }
    
    void setENDERECO(Endereco endereco){
        this.endereco=endereco;
    }
    
    void setTELEFONES(Collection<Telefone> telefones){
        this.telefones = telefones;
    }
    
    int getID(){
        return id;
    }
    
    String getNOME(){
        return nome;
    }
    
    String getEMAIL(){
        return email;
    }
    
    Endereco getENDERECO(){
        return endereco;
    }
    
    Collection<Telefone> getTELEFONES(){
        return telefones;
    }
}

CLASSE ENDERECO:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package arquivosxml;

/**
 *
 * @author marcio
 */
public class Endereco {

    private int id;
    private String logradouro;
    private String bairro;
    private String cep;
    private String cidade;
    private String complemento;
    private int numero;

    void setID(int id) {
        this.id = id;
    }

    void setLOGRADOURO(String logradouro) {
        this.logradouro = logradouro;
    }

    void setbairro(String bairro) {
        this.bairro = bairro;
    }

    void setcep(String cep) {
        this.cep = cep;
    }

    void setcidade(String cidade) {
        this.cidade = cidade;
    }

    void setcomplemento(String complemento) {
        this.complemento = complemento;
    }

    void setnumero(int numero) {
        this.numero = numero;
    }

    int getID() {
        return id;
    }

    String getLOGRADOURO() {
        return logradouro;
    }

    String getbairro() {
        return bairro;
    }

    String getcep() {
        return cep;
    }

    String getcidade() {
        return cidade;
    }

    String getcomplemento() {
        return complemento;
    }

    int getnumero() {
        return numero;
    }
}

CLASSE TELEFONE:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package arquivosxml;

/**
 *
 * @author marcio
 */
public class Telefone {
    private int id;
    private int ddd;
    private int numero;
    
    void setID(int id){
        this.id=id;
    }
    
    void setDdd(int ddd){
        this.ddd=ddd;
    }
    
    void setNumero(int numero){
        this.numero=numero;
    }
    
    
    
    
    int getID(){
        return id;
    }
    
    int getDdd(){
        return ddd;
    }
    
    int getNumero(){
        return numero;
    }
    
}
nel

Simples colega, o erro diz que “não é possível inserir um Elemento nele mesmo”.
O código da linha 130 do método gerarXML tenta isso, conforme abaixo.

//Inserimos na tag raiz as tag Endereco tagEndereco.addContent(tagEndereco);

Não seria adicionar a tagEndereco ao contato?

C

Perfeita observação… .

Desculpe-me pela falta de prática em reconhcer os erros de compilação…

No entanto, foi corrigido, conforme me orientado, porém obtive um novo erro, mas percebe-se que o arquivo já foi criado.

run:

XML criado com sucesso!

Exception in thread main java.lang.NumberFormatException: null

at java.lang.Integer.parseInt(Integer.java:417)

at java.lang.Integer.parseInt(Integer.java:499)

at arquivosxml.ClassePrincipal.lerXML(ClassePrincipal.java:62)

at arquivosxml.ClassePrincipal.main(ClassePrincipal.java:197)

Java Result: 1

CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)
nel

Essa linha aponta para cá :

endereco.setcidade(endElement.getChildText("cidade"));

Bom, não sei se está correta a linha, se estiver, tens que analisar se está correta e o conteúdo dela no seu XML.
Mas o erro é algo como:

Integer i = new Integer("null");
C

O erro estava no endNumero, mas de qualquer forma, transformei tudo em String, e compilou normalmente… ^^

Sou inteiramente grato pela colaboração, agora irei adequar de acordo com o meu XML… valeu… ^^

nel

cajubino:
O erro estava no endNumero, mas de qualquer forma, transformei tudo em String, e compilou normalmente… ^^

Sou inteiramente grato pela colaboração, agora irei adequar de acordo com o meu XML… valeu… ^^

De nada, o pessoal aqui no GUJ é atencioso, basta ser educado :slight_smile:
Por favor, apenas adicione [Resolvido] ao inicio ou fim do seu tópico, assim sabemos que sua dúvida foi sanada.

Abraços e boa sorte.

C

Obtive sucesso com o teste de leitura e geração de arquivos XML, porém senti vontade de chorar neste momento, quando peguei o real arquivo XML…

<?xml version="1.0" encoding="ISO-8859-1" ?> <Dados> <DadosAssinante> <IdAssinante>XXXXX</IdAssinante> <DadosCobranca> <LogradouroCobranca>XX XXXX XXX XX XXXXX</LogradouroCobranca> <DadosBoleto> <NossoNumero>XXXXX</NossoNumero> <DadosContrato> <NumContrato>XXXX</NumContrato> </DadosContrato> </DadosBoleto> </DadosCobranca> </DadosAssinante><DadosAssinante> <IdAssinante>XXXXX</IdAssinante> <DadosCobranca> <LogradouroCobranca>XX XXXX XXX XX XXXXX</LogradouroCobranca> <DadosBoleto> <NossoNumero>XXXXX</NossoNumero> <DadosContrato> <NumContrato>XXXX</NumContrato> </DadosContrato> </DadosBoleto> </DadosCobranca> </DadosAssinante> <DadosAssinante> <IdAssinante>XXXXX</IdAssinante> <DadosCobranca> <LogradouroCobranca>XX XXXX XXX XX XXXXX</LogradouroCobranca> <DadosBoleto> <NossoNumero>XXXXX</NossoNumero> <DadosContrato> <NumContrato>XXXX</NumContrato> </DadosContrato> </DadosBoleto> </DadosCobranca> </DadosAssinante> <\Dados>

Ou seja, levando em consideração o XML acima, com base no código proposto para a leitura de arquivos XML:

Dados -> Root
Precisaria listar o DadosAssinante com um laço de repetição até concluir o mesmo.

List<Telefone> telefones = new ArrayList<Telefone>(); //Criamos uma lista de Element para receber a tag Telefones List<Element> fonesElement = elements.getChild("Telefones").getChildren(); //Loop em fonesElement para pegar as demais tags for( Element fone : fonesElement){ //Criamos um objeto telefone que receber os valores em cada posição de fonesElement Telefone telefone = new Telefone(); telefone.setID(Integer.parseInt(fone.getChildText("id")));System.out.println(telefone.getID()); telefone.setDdd(Integer.parseInt(fone.getChildText("ddd")));System.out.println(telefone.getDdd()); telefone.setNumero(Integer.parseInt(fone.getChildText("numero")));System.out.println(telefone.getNumero()); //Adicionando na lista de Telefones o objeto Telefone telefones.add(telefone); } //Adicionando no objeto contato a lista de telefones contato.setTELEFONES(telefones); System.out.println(contato.toString());
Tentei utilizar a mesma lógica acima, proposta no código de exemplo, na tag Telefone, mas não obtive sucesso.

Como eu poderia fazer isso?

C

Então Nel,

Consegui resolver a primeira parte da seguinte forma:

Element elements = doc.getRootElement(); List<Element> dadosAssinan = elements.getChildren(); //Loop em fonesElement para pegar as demais tags for( Element data : dadosAssinan){ //Criamos um objeto telefone que receber os valores em cada posição de fonesElement DadosAssinante dadosAss = new DadosAssinante(); dadosAss.setIdAssinante(data.getChildText("IdAssinante"));System.out.println(dadosAss.getIdAssinante()); dadosAss.setCodigoAssinante(data.getChildText("CodigoAssinante"));System.out.println(dadosAss.getCodigoAssinante()); dadosAss.setNomeAssinante(data.getChildText("NomeAssinante"));System.out.println(dadosAss.getNomeAssinante()); }

Tentarei fazer os demais tags… ^^ Agradecido novamente…

romarcio

Seu problema vai dar trabalho, porque você vai precisar criar um laço para cada tag pai.
O primeiro FOR vai ler a tag <Dados> dentro desse FOR vai ter um para ler a tag <DadosAssinante> dentro desse um para ler a tag <DadosCobranca> … e assim por diante. Dai quando acabar de ler tudo dentro de <DadosAssinante>, o primeiro FOR <Dados> anda uma posição para ler a seguinte tag <DadosAssinante> e todas as demais dentro dela.

nel

Certo.

Por isso sugeri o xStream ou JAXB anteriormente, pois eles abstraem esse tipo de problema que tu encontra em XML´s com muitas tags filhos.
Mas é bom lidar assim, aprende bem.

Abraços.

romarcio

nel:
Certo.

Por isso sugeri o xStream ou JAXB anteriormente, pois eles abstraem esse tipo de problema que tu encontra em XML´s com muitas tags filhos.
Mas é bom lidar assim, aprende bem.

Abraços.

Por isso eu disse no post anteior: “Se fizer os 3 tutoriais, vai ter uma boa base, escolha um deles, o que seja mais simples para você e seu projeto.”

romarcio:
Se é seu primeiro contato, melhor praticar antes:

3 formas de ler e criar arquivos xml com java:
Manipulando Arquivo XML ? Parte I: API Nativa
Manipulando Arquivo XML ? Parte II: JDOM
Manipulando Arquivo XML ? Parte III: XStream

Se fizer os 3 tutoriais, vai ter uma boa base, escolha um deles, o que seja mais simples para você e seu projeto.

Nesse caso o XStrem seria bem mais simples que o JDOM.

C

Eu li os três tutoriais que me enviou, no estou sou muito grato. Porém o JDOM associei com mais facilidade..
Até o prezado momento, estou conseguindo efetuar a leitura sequencial das informações, porém ao efetuar a leitura do DadosBoleto em uma parte do arquivo XML obtive alguns erros

ERROR 1:
(...)
1
45529
Exception in thread "main" java.lang.NullPointerException
#############################################################################
30613
9101
MARIA xxxxx xxxxxx
(...)
ERROR 2:
(...)
30888
10681
	at XML.ClasseLeitor.lerXML(ANDERSON ANTONIO SACHETTI
xxxxxxxxxxxxxx
40.xxx.xxx-0
ClasseLeitor.java:63Rua xxxxxxMartino
) 
564

	at XML.ClasseLeitor.main(
ClasseLeitor.java:75)

JD NOVA GARÇA

(...)
Linha 63:
boleto.setNossoNumero(x.getChildText("NossoNumero"));System.out.println(boleto.getNossoNumero());
Linha 75:
lerXML();

Segue abaixo o código que estou utilizando para efetuar a leitura:

public static void lerXML() throws JDOMException, IOException{
        //Criamos um objeto SAXBuilder
        //para ler o arquivo
        SAXBuilder sb = new SAXBuilder();
        //Criamos um objetvo Document que irá receber o conteúdo do arquivo
        Document doc = sb.build("c:/XML.xml");
        //Criamos um objeto Element que recebe as tags do XML
        Element elements = doc.getRootElement();        
        List<Element> dadosAssinan = elements.getChildren();        
        //Loop em fonesElement para pegar as demais tags
        for( Element data : dadosAssinan){
            //Criamos um objeto telefone que receber os valores em cada posição de fonesElement
            DadosAssinante dadosAss = new DadosAssinante();
            dadosAss.setIdAssinante(data.getChildText("IdAssinante"));System.out.println(dadosAss.getIdAssinante());
            dadosAss.setCodigoAssinante(data.getChildText("CodigoAssinante"));System.out.println(dadosAss.getCodigoAssinante());
            dadosAss.setNomeAssinante(data.getChildText("NomeAssinante"));System.out.println(dadosAss.getNomeAssinante());
            dadosAss.setCpfCnpj(data.getChildText("CpfCnpj"));System.out.println(dadosAss.getCpfCnpj());
            dadosAss.setRgIe(data.getChildText("RgIe"));System.out.println(dadosAss.getRgIe());
            dadosAss.setLogradouroResidencial(data.getChildText("LogradouroResidencial"));System.out.println(dadosAss.getLogradouroResidencial());
            dadosAss.setNumeroResidencial(data.getChildText("NumeroResidencial"));System.out.println(dadosAss.getNumeroResidencial());
            dadosAss.setAptoSala(data.getChildText("AptoSala"));System.out.println(dadosAss.getAptoSala());
            dadosAss.setBloco(data.getChildText("Bloco"));System.out.println(dadosAss.getBloco());
            dadosAss.setEdificio(data.getChildText("Edificio"));System.out.println(dadosAss.getEdificio());
            dadosAss.setComplementoResidencial(data.getChildText("ComplementoResidencial"));System.out.println(dadosAss.getComplementoResidencial());
            dadosAss.setBairroResidencial(data.getChildText("BairroResidencial"));System.out.println(dadosAss.getBairroResidencial());
            dadosAss.setCidadeResidencial(data.getChildText("CidadeResidencial"));System.out.println(dadosAss.getCidadeResidencial());
            dadosAss.setUfResidencial(data.getChildText("UfResidencial"));System.out.println(dadosAss.getUfResidencial());
            dadosAss.setQtdeBoletosVencidos(data.getChildText("QtdeBoletosVencidos"));System.out.println(dadosAss.getQtdeBoletosVencidos());
            dadosAss.setIdentificadorDebito(data.getChildText("IdentificadorDebito"));System.out.println(dadosAss.getIdentificadorDebito());
            dadosAss.setTermoQuitacaoDebito(data.getChildText("TermoQuitacaoDebito"));System.out.println(dadosAss.getTermoQuitacaoDebito());
            
            Element dadoscobranca = data.getChild("DadosCobranca");
            DadosCobranca cobranca = new DadosCobranca();
            cobranca.setLogradouroCobranca(dadoscobranca.getChildText("LogradouroCobranca"));System.out.println(cobranca.getLogradouroCobranca());
            cobranca.setNumeroCobranca(dadoscobranca.getChildText("NumeroCobranca"));System.out.println(cobranca.getNumeroCobranca());
            cobranca.setComplementoCobranca(dadoscobranca.getChildText("ComplementoCobranca"));System.out.println(cobranca.getComplementoCobranca());
            cobranca.setCepCobranca(dadoscobranca.getChildText("CepCobranca"));System.out.println(cobranca.getCepCobranca());
            cobranca.setCidadeCobranca(dadoscobranca.getChildText("CidadeCobranca"));System.out.println(cobranca.getCidadeCobranca());
            cobranca.setUfCobranca(dadoscobranca.getChildText("UfCobranca"));System.out.println(cobranca.getUfCobranca());
            cobranca.setQtdeRevista(dadoscobranca.getChildText("QtdeRevista"));System.out.println(cobranca.getQtdeRevista());
            
            Element x = dadoscobranca.getChild("DadosBoleto");
            DadosBoleto boleto = new DadosBoleto();
            boleto.setNossoNumero(x.getChildText("NossoNumero"));System.out.println(boleto.getNossoNumero());
            
            System.out.println("#############################################################################");
            
            
        }        
    }

Att, Eduardo Pereira

romarcio

Exception in thread "main" java.lang.NullPointerException #############################################################################
Esta dando na hora da leitura ou na hora que você está imprimindo na tela?
Se for na hora de imprimir na tela, é porque o objeto está nulo, ou seja, não recuperou tal campo do XML.

C

Os dois erros acontecem quase sequencialmente, porém após o erro, para-se a leitura do arquivo XML, mostrando na tela somente aqueles que ele conseguiu ler.

Observei o arquivo XML, onde está apontando o erro, no entanto, está normal como todas as outras informações…

nel

cajubino:
Os dois erros acontecem quase sequencialmente, porém após o erro, para-se a leitura do arquivo XML, mostrando na tela somente aqueles que ele conseguiu ler.

Observei o arquivo XML, onde está apontando o erro, no entanto, está normal como todas as outras informações…

Poste ambos os erros e suas respectivas stacktrace completa.
Também poste todo o seu código.

Abraços.

C

Nel, agradeço a disposição em ajudar, e peço desculpas em pedir a colaboração de vocês em quase todo o processo.

Estive observando o arquivo XML, os erros de exceções causados, são devido alguns clientes não terem alguns campos, no entanto, estou criando um arquivo e separando esses clientes que estão fora do padrão assinalando “clientes com erro”.

Até o prezado momento, está tudo correndo bem… ^^

Grato, Eduardo Pereira.

PS: Assim que eu concluir, eu envio para vocês o meu projeto para vocês visualizarem( Minha primeira aplicação =) ).

C

TÓPICO ENCERRADO!

Criado 18 de janeiro de 2012
Ultima resposta 24 de jan. de 2012
Respostas 29
Participantes 3