[RESOLVIDO] Uso do método hasChildNodes - Parser XML usando DOM

3 respostas
Andre_Fonseca

Ola

Eu tenho o seguinte arquivo xml:

<usuarios>
	<login size="10" type="char">afonseca</login>
	<senha size="15" type="int">testando</senha>
	<endereco>
		<rua size="10" type="char">avenida senador ricardo batista</rua>
		<cidade size="10" type="char">sao bernardo do campo</cidade>
	</endereco>
</usuarios>

E estou fazendo o seguinte:

DocumentBuilderFactory dbf 	= DocumentBuilderFactory.newInstance();
DocumentBuilder db 			= dbf.newDocumentBuilder();
Document doc 				= db.parse("input/"+nomeArquivoXML);	
Element docElement 			= doc.getDocumentElement();			
NodeList parentNodeList		= docElement.getChildNodes();
			

for (int i=0; i<parentNodeList.getLength(); i++) {
    Node node = parentNodeList.item(i);
    if (node.getNodeType() == Node.ELEMENT_NODE) {
        System.out.print("Nome: "+node.getNodeName());
	System.out.print(" Possui filhos? "+node.hasChildNodes());
	System.out.println();					
					
	if (node.hasAttributes()) {
	    Element el 	= (Element)node;
	    int size 	= Integer.parseInt(el.getAttribute("size"));
	    String type = el.getAttribute("type");
	    System.out.print("size: "+size);
	    System.out.println(" type: "+type);						
	}
    }
}

Entretando o metodo hasChildNodes returna true para todos os nos, deveria retornar true apenas para o elemento endereco certo??

O que eu preciso fazer é:
Se é um elemento e nao possui filhos recupera os atributos size e type

Se é um elemento e possui filhos recupera os filhos e recupera os atributos size e type

Eu preciso usar recursao aqui??

Obrigado >

3 Respostas

T

1 - hasChildNodes para o elemento <senha> tem de retornar o nó “testando”, por exemplo. (Não se esqueça que texto, comentários e CTYPE, mesmo que seja vazio ou só espaços em branco, conta como nó do tipo Texto.)
Portanto você tem de verificar se os nós filhos são só texto ou se você tem outros tags.

4 - Se a estrutura é em árvore, é mais fácil usar recursão.

Andre_Fonseca

thingol:
André Fonseca:

1 - Entretanto o método hasChildNodes retorna true para todos os nós, deveria retornar true apenas para o elemento endereco certo??

2 - Se é um elemento e não possui filhos recupera os atributos size e type

3 - Se é um elemento e possui filhos recupera os filhos e recupera os atributos size e type

4 - Eu preciso usar recursão aqui?

1 - hasChildNodes para o elemento <senha> tem de retornar o nó “testando”, por exemplo. (Não se esqueça que texto, comentários e CTYPE, mesmo que seja vazio ou só espaços em branco, conta como nó do tipo Texto.)
Portanto você tem de verificar se os nós filhos são só texto ou se você tem outros tags.

4 - Se a estrutura é em árvore, é mais fácil usar recursão.

thingol,

pelo que eu vi na API (http://java.sun.com/j2se/1.4.2/docs/api/org/w3c/dom/Node.html) o metodo hasChildNodes tem que retornar um boolean dizendo se o no tem ou nao filhos, mas nao parece que isso ocorre, ou entao to usando errado

minha ideia é usar mesmo recursao, se tem filhos chama o metodo novamente para o filho

[]´s

Andre_Fonseca

Consegui resolver aqui, para aqueles que tiverem interesse ficou assim:

private void listaElementos() {
		
	try {
		DocumentBuilderFactory dbf 	= DocumentBuilderFactory.newInstance();
		DocumentBuilder db 		= dbf.newDocumentBuilder();
		Document doc 			= db.parse("teste.xml");	
		Node docElement 		= doc.getDocumentElement();
		// retorna todos os filhos de docElement
		NodeList root			= docElement.getChildNodes();			
		// chama recursivamente o metodo que printa os filhos
		recuperaFilhos(root);
			
	} catch (ParserConfigurationException e) {
		e.printStackTrace();
	} catch (SAXException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}		

private void recuperaFilhos(NodeList root) {
	Node node;
	for (int i=0; i&lt;root.getLength(); i++) {
		node = root.item(i);
		if (node.getNodeType() == Node.ELEMENT_NODE) {
			String nodeName = node.getNodeName();
			System.out.print("nome:"+nodeName);
				
			if (node.hasAttributes()) {
				Element el 	= (Element)node;
				int size 	= Integer.parseInt(el.getAttribute("size"));
				String type = el.getAttribute("type");
				System.out.print(" valor:"+el.getFirstChild().getNodeValue());
				System.out.print(" size:"+size);
				System.out.println(" type:"+type);	
			}
			else {
				System.out.println();
				NodeList filhos = node.getChildNodes();
				recuperaFilhos(filhos);
			}
		}
	}		
}
arquivo XML
&gt;&lt;usuarios&gt;
	&lt;login size="10" type="char"&gt;afonseca&lt;/login&gt;
	&lt;senha size="15" type="int"&gt;testando&lt;/senha&gt;
	&lt;endereco&gt;
		&lt;rua size="10" type="char"&gt;avenida senador ricardo batista&lt;/rua&gt;
		&lt;cidade size="10" type="char"&gt;sao bernardo do campo&lt;/cidade&gt;
	&lt;/endereco&gt;
&lt;/usuarios&gt;
Criado 24 de outubro de 2007
Ultima resposta 25 de out. de 2007
Respostas 3
Participantes 2