Como ler esta estrutura de XML em java

9 respostas Resolvido
J

Olá pessoal tudo bem, sou novo em java e estou com um projeto de tcc que funciona da seguinte maneira:

Tenho um xml que esta nessa estrutura

<?xml version="1.0" encoding="utf-8"?>
<LIST>
    <DADOSCLI>
        <DADOS ID="cep" VALUE="00000" />
        <DADOS ID="uf" VALUE="SP" />
        <DADOS ID="rep_telefoneempresa" VALUE="00000" />
        <DADOS ID="rep_cidadeempresa" VALUE="São Paulo" />
        <DADOS ID="nomecliente" VALUE="Jose Teste" />
        <DADOS ID="observacoes" VALUE="000" />
        <DADOS ID="fone" VALUE="0000" />
        <DADOS ID="rep_cnpjempresa" VALUE="" />
        <DADOS ID="rep_emailempresa" VALUE="[email removido]" />
        <DADOS ID="bairro" VALUE="fffff" />
        <DADOS ID="codcliente" VALUE="00" />
        <DADOS ID="contatoempresa" VALUE="" />
        <DADOS ID="endentrega" VALUE="" />
        <DADOS ID="email" VALUE="" />
        <DADOS ID="rep_ufempresa" VALUE="SP" />
        <DADOS ID="rep_bairroempresa" VALUE="Morumbi" />
        <DADOS ID="cpfcnpj" VALUE="" />
    </DADOSCLI>
</LIST>

Certo, porém, aqui está o meu problema: Não estou conseguindo pegar o elemento que preciso. Ex.:

<DADOS ID="cep" VALUE="00000" />

Preciso buscar o VALUE deste ID="cep". Segue o meu código em java:

try {
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	DocumentBuilder builder = factory.newDocumentBuilder();
	
	//abre e faz o parser de um documento xml de acordo com o nome passado no parametro
	Document doc = builder.parse("meuarquivo.xml");
	
	//cria uma lista de dadosCli. Busca no documento todas as tag dadosCli
	NodeList listaDedadosCli = doc.getElementsByTagName("DADOSCLI");
	
	//pego o tamanho da lista de dadosCli
	int tamanhoLista = listaDedadosCli.getLength();
	
	//varredura na lista de dadosCli
	for (int i = 0; i < tamanhoLista; i++) {
		//pego cada item (dadosCli) como um  (node)
		Node nodadosCli = listaDedadosCli.item(i);
		
		//verifica se o nodadosCli é do tipo element (e não do tipo texto etc)
		if(nodadosCli.getNodeType() == Node.ELEMENT_NODE) {
			//caso seja um element, converto o no dadosCli em Element pessoa
			Element elementodadosCli = (Element) nodadosCli;
			
			// posso pegar o atributo do element
			String id = elementodadosCli.getAttribute("id");
			
			//recupero os nos filhos do elemento dadosCli
			NodeList listaDeFilhosDadadosCli = elementodadosCli.getChildNodes();
			
			//pego o tamanho da lista de filhos do elemento dadosCli
			int tamanhoListaFilhos = listaDeFilhosDadadosCli.getLength();
			
			//varredura na lista de filhos do elemento dadosCli
			for (int j = 0; j < tamanhoListaFilhos; j++) {
				//crio um no com o cada tag filho dentro do no pessoa (tag nome, idade e peso)
				Node noFilho = listaDeFilhosDadadosCli.item(j);
				
				//verifico se são tipo element
				if(noFilho.getNodeType() == Node.ELEMENT_NODE){
					//converto o no filho em element filho
					Element elementoFilho = (Element) noFilho;
					
					// aqui que estou perdido pessoal
				}
			}
		}
	}
} catch (ParserConfigurationException ex) {
	Logger.getLogger(TccXMLDom.class.getName()).log(Level.SEVERE, null, ex);
} catch (SAXException ex) {
	Logger.getLogger(TccXMLDom.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
	Logger.getLogger(TccXMLDom.class.getName()).log(Level.SEVERE, null, ex);
}

Alguém pode me ajudar por favor?
Muito obrigado pela atenção…

9 Respostas

A

Element elementoFilho = (Element) noFilho;

Nessa linha acima vc está pegando cada elemento DADOS da estrutura, basta pegar os atributos ID e VALUE de cada um agora:

String id = elementoFilho.getAttribute(“ID”);
String value = elementoFilho.getAttribute(“VALUE”);

J

alisonjf obrigado pela dica ela resolveu o meu problema em questão do VALUE
como faço se desses elementos quero escolher os que vai ser exibidos?

ex:

se eu quiser pegar somente 2 elementos

poderia só me tirar esta duvida por favor, obrigado.

A

Se usar JAXB o que deseja seria o comportamento default, você configura valor e ele mostra, caso contrario não sai a tag no XML, mas como esta trabalhando de uma forma mais manual você não foge de validar com sua lógica todo atributo e tag xml a ser adicionada.

J

Esta foi uma forma que encontrei em livros e pesquisas através de elementos e atributos a dica do alissonjf foi muito boa, porem o meu problema é só escolher o que eu quero ler.

J

cheguei a colocar um switch para ver se pega o valor correto

NodeList listaDeDADOSc = doc.getElementsByTagName(“DADOS”);

int tamanhoListaDADOSc = listaDeDADOSc.getLength();
                             
                             for (int l = 0; l < tamanhoListaDADOSc; l++) {
            
            
            Node noDADOS = listaDeDADOSc.item(l);
            
            if(noDADOS.getNodeType() == Node.ELEMENT_NODE){
            
                                                                   
            Element elementoDADOSc = (Element) noDADOS;
            
            
             String id = elementoDATAc.getAttribute("ID");
             
             
             
             switch(elementoDATAc.getTagName()){
                           case "cep":
                                
                                    
                                 String VLc = elementoFilho.getAttribute("VALUE");
                                System.out.println("VLc");
                              
                                break;
             }
L

dá uma pesquisada na classe XStream, facilita bastante a conversão entre XML -> Object e vice versa.

J

Obrigado pela dica vou estudar XStream para fazer.

A

Complementando…

Esse switch que vc fez dá certo, só que ao invés de fazer o switch pelo elementoDATAc.getTagName(), usa a variável id que vc já tem, se esse id for “cep” então vc pega o value…

J
Solucao aceita

NodeList listaDeDADOSc = doc.getElementsByTagName(“DADOS”);

int tamanhoListaDADOSc = listaDeDADOSc.getLength();

                         for (int l = 0; l < tamanhoListaDADOSc; l++) {


        Node noDADOS = listaDeDADOSc.item(l);

        if(noDADOS.getNodeType() == Node.ELEMENT_NODE){


        Element elementoDADOSc = (Element) noDADOS;


         String id = elementoDADOSc.getAttribute("ID");



         switch(id){
                       case "cep":


                             String VLc = elementoFilho.getAttribute("VALUE");
                            System.out.println("VLc");

                            break;
         }

Obrigado alisonjf deu certo aqui muito obrigado, analisando agora vi que foi falta de atenção minha mesmo…

Criado 5 de janeiro de 2016
Ultima resposta 8 de jan. de 2016
Respostas 9
Participantes 4