Percorre arvore XML para identeificar elementos [Resolvido]

Estou com o seguinte problema tenho um XML que tem algumas informações onde eu preciso pega-las para fazer um insert em uma tabela, o problema é identificar os dados pois tem tags com o mesmo nome no XML, mas ele tem uma hierarquia onde as informações estão seguindo o esquema:
Ex.:

1

Onde algumas tags tem seus filhos que podem ou não ter filhos, preciso identificar as tags para saber de onde estão vindo as informações para o caso de tags que repetem o nome, não sei se ficou clara meu problema mas estou postando o codigo para analise.

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;


import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class LoadWithDOM {
	public static void main(String[] args) {

		try {
			teste teste =  new teste();
			
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document doc = db
					.parse("C:\\Documents and Settings\\DEV-3\\Desktop\\contato.xml");
			Element elem = doc.getDocumentElement();
			System.out.println("O elemento raiz é: " + elem.getNodeName());
			
			
			NodeList n2 = elem.getChildNodes();
			
				teste.filhosRecursico(n2);
		
		} catch (ParserConfigurationException e) {
			System.out.println("Primeiro");
			e.printStackTrace();
		} catch (SAXException e) {
			System.out.println("Segundo");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("Terceiro");
			e.printStackTrace();
		}
	}
}



import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.sun.xml.internal.bind.marshaller.NioEscapeHandler;

public class teste {

	public void filhosRecursico(NodeList nl) {
		// for que percorre os irmão do No
		for (int i = 0; i <= nl.getLength(); i++) {
		
			// Testa para ver se é um elemento
			if (nl.item(i) instanceof Element) {
				Element elem = null;
				if (nl.item(i) == null) {
					System.out.println("NULL");
				} else {
					
					
					NodeList node = nl.item(i).getChildNodes();
					
					//testa se tem filhos ou não se tiver chama o metodo novamente
					if (node.getLength() > 1) {
						
						elem = (Element) nl.item(i);
						
						System.out.println(elem.getNodeName());
						System.out.println(elem.getTextContent());
						
					} else {
						
						filhosRecursico(node);
					}
					
				}
			}else{
				Node node = nl.item(i);
				if (node == null){
					System.out.println("NULL");
				}else{
					
					System.out.println("Else Name "+node.getNodeName());
					System.out.println("Else Valor "+node.getTextContent());
				}
			} 
		}

	}

}

O XML que estou utilizando para testar


<?xml version="1.0" encoding="UTF-8"?>
<agenda>
	<contato id="01">
		<nome>Maria da Silva</nome>
		<endereco>Rua Ficticia, 32, Bairro Ficticio, Ficticia City</endereco>
		<telefone>21 - 32658978</telefone>
		<email>maria.silva@provedor.com.br</email>
	</contato>
	<teste>teste</teste>
	<teste2>
		<teste3>
			<teste4>testes</teste4>
		</teste3>
	</teste2>
	<contato2 id="02">
		<nome>João da Silva</nome>
		<endereco>Rua Inventada, 12, Bairro Inventado, Inventada City</endereco>
		<telefone>11 - 24569865</telefone>
		<email>joao.silva@provedor.com.br</email>
	</contato2>
</agenda>

A classe teste percorre a arvore e imprime as tagas e seus valores mas esta imprimindo linhas em branco e não consigo pegar todas as tags filhas, se alguem puder me ajudar agradeço muito e desculpe se postei no lugar errado.

Nesse link que vou te passar, tem 3 exemplos de fazer parser em XML parecido com esse seu: http://mballem.wordpress.com/category/arquivos-xmltxtproperties/
Escolha o que mais te agrada e mão na massa ;D

[quote=romarcio]Nesse link que vou te passar, tem 3 exemplos de fazer parser em XML parecido com esse seu: http://mballem.wordpress.com/category/arquivos-xmltxtproperties/
Escolha o que mais te agrada e mão na massa ;D[/quote]

Vou dar uma olhada Valeu, e se conseguir solucionar o problema posto aqui.

Nos tutorias que o romarcio passou faz a leitura de uma forma em que o xml tem que ser fixo no meu caso preciso que seja dinamico pois podem vir mais ou menas informações, não sei se eu é que não entendi o que o tutorial está propondo, alguem poderia me ajudar por favor e me digão se estou indo pelo caminho certo com o codigo que eu postei anteriormente, obrigado.

Você está usando o org.w3c. né …
Olha esses dias criei esse método :


	/**
	 * Método que busca um Node com base em um nível hierarquico. (Método recursivo)
	 * @param pai (Node elementoPai)
	 * @param niveis (arvore hierárquica)
	 * @return Lista de Nodes que possuem nome igual ao ultimo elemento do array
	 */
	public static ArrayList<Node> getNodesInTree(Node pai, String[] niveis){
		NodeList childs = pai.getChildNodes();		
		ArrayList<Node> retorno = new ArrayList<Node>();
		for(int i=0; i<childs.getLength(); i++){
			Node child = childs.item(i);
			if(niveis.length==1){// buscando ultimo nível (tag procurada)
				if(child.getNodeName().equals(niveis[0])){
					retorno.add(child);
				}				
			}else if(child.getNodeName().equals(niveis[0])){
					niveis = Arrays.copyOfRange(niveis, 1, niveis.length);
					retorno = getNodesInTree(child, niveis);					
			}
		}		
		return retorno; 
	}

Vamos usar o exemplo do meu XML aqui :

<Address>
    outras tags aqui
   <PostalAddress>
       outras tags aqui
      <State>
          PR
      </State>
   </PostalAddress>
</Address

para obter o node voce faria a sequinte chamada :

// se fosse uma lista de Estados : 
ArrayList<Node> estado = XMLUtils.getNodesInTree(shipTo, new String[]{"Address", "PostalAddress", "State"})

// se existir apenas um estado aí vc pode pegar a posição 0 (zero) direto 
Node estado = XMLUtils.getNodesInTree(shipTo, new String[]{"Address", "PostalAddress", "State"}).get(0);

Claro que vc tem que fazer uns tratamentos pra caso a tag não exista e tal …
Mas com esse método aí vc percorre a arvore hierárquica e consegue pegar exatamente o elemento que vc quer :smiley:

Espero ter ajudado !
Falow !