Imprimir apenas nodos folhas usando DOM!

Olá Pessoal. Eu preciso varrer uma árvore xml e obter os nomes e atributos dos nodos folhas. Estou usando DOM e criei uma função recursiva que funciona mas
imprime uns valores estranhos.

O XML que estou usando:

<automato>
	<simbolos>
		<simbolo caracter="a">A</simbolo>
		<simbolo caracter="b">B</simbolo>
		<simbolo caracter="c">C</simbolo>
	</simbolos>
	<estados>
		<estado id="1" inicial="true" terminal="false" caracter="A" />D1</estado>
		<estado id="2" inicial="false" terminal="false" caracter="B"></estado>
		<estado id="3" inicial="false" terminal="true" caracter="C"></estado>
	</estados>
	<transicoes>
		<transicao origem="A" destino="B" simbolo="a"></transicao>
		<transicao origem="B" destino="A" simbolo="b"></transicao>
		<transicao origem="C" destino="C" simbolo="c"></transicao>
	</transicoes>
</automato>

A função:

private void obterNomeValor(Node nodo){
          
        if(!nodo.hasChildNodes())
            System.out.println("Nome nodo folha "+nodo.getNodeName()+" valor "+nodo.getNodeValue());
     
        NodeList children = nodo.getChildNodes();
        for(int i=0;i<children.getLength();i++){
               Node novonodo = children.item(i);
               obterNomeValor(novonodo);
         }     
    }

Esses são os valores imprimidos:

Nome nodo folha #text valor 
	
Nome nodo folha #text valor 
		
Nome nodo folha #text valor A
Nome nodo folha #text valor 
		
Nome nodo folha #text valor B
Nome nodo folha #text valor 
		
Nome nodo folha #text valor C
Nome nodo folha #text valor 
	
Nome nodo folha #text valor 
	
Nome nodo folha #text valor 
		
Nome nodo folha #text valor D1
Nome nodo folha #text valor 
		
Nome nodo folha estado valor null
Nome nodo folha #text valor 
		
Nome nodo folha estado valor null
Nome nodo folha #text valor 
	
Nome nodo folha #text valor 
	
Nome nodo folha #text valor 
		
Nome nodo folha transicao valor null
Nome nodo folha #text valor 
		
Nome nodo folha transicao valor null
Nome nodo folha #text valor 
		
Nome nodo folha transicao valor null
Nome nodo folha #text valor 
	
Nome nodo folha #text valor 

Ou seja, a função esta imprimindo tudo! E eu queria apenas os nodos folhas. Alguém sabe o que eu posso fazer? Obrigado!

<estado id="1" inicial="true" terminal="false" caracter="A" />D1</estado> 

Estou imaginando que você quer imprimir algo como:

tag = estado
atributos: id = 1, inicial = true, terminal = false, caracter = A
texto: D1

Como você deve ter percebido, nodo.hasChildNodes não é a solução do seu problema. É que Node pode ser, por exemplo, #text.

O que você quer é um Element (não exatamente um Node) que não tenha Elements como filhos. E isso é meio chato porque você vai ter de listar os filhos de um Element e checar se nenhum deles é um Element.

No caso específico de seu XML, que aparentemente não tem mais de 3 níveis ("/automato/simbolos/simbolo", “/automato/estados/estado”, “/automato/transicoes/transicao”) eu aconselharia usar XPath, que é mais fácil de entender - usei a notação XPath para representar os elementos que você quer pegar) e não precisa de nada dessas coisas recursivas.