Parseando XML com o DOM

27 respostas
A

Assunto: Uma maneira fácil e simples de extrair informações de um XML. O DOM deixa que você atravesse a hierarquia do XML como uma árvore.

Você pode ler este tutorial na íntegra http://www.guj.com.br/java.artigo.22.1.guj

Por favor, coloque as suas dúvidas e seus comentários sobre este tutorial aqui.
Sinta-se livre para fazer qualquer tipo de pergunta, desta maneira você estará nos ajudando e aos outros usuários!

27 Respostas

urubatan

parabens pelo tutorias, ficou muito bom e bem simples :slight_smile:

urubatan

outra coisa, o DOM tem alguma coisatipo XPath??
estava acostumado a trabalhar com SAX :slight_smile:

por exemplo:
tenho o seguinte XML

<usisite>
	<requestmap>
		<request pattern="index.do" view="index.vm" class="net.usi.site.requests.IndexRequest" />
		<request pattern="index_top.do" view="index_top.vm" class="net.usi.site.requests.IndexTopRequest" />
		<request pattern="index_left.do" view="index_left.vm" class="net.usi.site.requests.IndexLeftRequest" />
		<request pattern="clientes.do" view="clientes.vm" class="net.usi.site.requests.ClientesRequest" />
		<request pattern="perfil.do" view="perfil.vm" class="net.usi.site.requests.PerfilRequest" />
		<request pattern="projetos.do" view="projetos.vm" class="net.usi.site.requests.ProjetosRequest" />
		<request pattern="sobre.do" view="sobre.vm" class="net.usi.site.requests.SobreRequest" />
		<request pattern="contato.do" view="contato.vm" class="net.usi.site.requests.ContatoRequest" />
	</requestmap>	
</usisite>

e quero utilizar um código parecido com:

Element elem = doc.getDocumentElement();
			// pega todos os elementos usuario do XML
			NodeList nl = (Element)elem.getElementsByTagName("requestmap/request");

e por enquanto sou obrigado a usar:

Element elem = doc.getDocumentElement();
			// pega todos os elementos usuario do XML
			NodeList nl = ((Element)elem.getElementsByTagName("requestmap").item(0)).getElementsByTagName("request");
J

Como eu faço para, por exemplo alterar (UPDATE) o valor do nó de <nome>Daniel Destro do Carmo</nome> para p.ex. <nome>Chiquinho da Mangueira</nome> ?

R

Ola pessoal !!!

como faço para ler o campo endereco co arquivo xml abaixo

<guj>



<nome>Daniel Destro do Carmo

</nome>

23

<endreco>

<rua>Rua AAAAAA</rua>

<email>[email removido]</email>

</endereco>
<nome>Paulo Silveira
&lt;/nome&gt;
<idade>21</idade>

<endreco>
<rua>Rua AAAAAA</rua>
<email>[email removido]</email>
</endereco>

<nome>
Rafael Steil&lt;/nome&gt;
<idade>23</idade>
&lt;endereco&gt;	
&lt;rua&gt;Rua AAAAAA&lt;/rua&gt;	
&lt;email&gt;[email removido]&lt;/email&gt;
 &lt;/endereco&gt;
<nome>Guilherme Silveira</nome> 20 <endereco> <rua>Rua AAAAAA</rua> <email>[email removido]</email> </endereco> </guj>

Um abraço a todos

danieldestro

String email = getChildTagValue( tagUsuario.getElementsByTagName(“endereco”), “email” );

R

Valeu cara era isso mesmo !!

so que antes eu tive que criar um NodeList

o codigo ficou assim :

NodeList n1= tagUsuario.getElementsByTagName(“endereco”);
Element tagUsuario1 = (Element) n1.item( 0 );

String email = getChildTagValue( tagUsuario1, "rua" );
    email += getChildTagValue( tagUsuario1, "email" );

obrigado pelas dicas !!!

V

E isso funcionou???

A classe String é imutável… isso não funciona

danieldestro

Isso funciona sim amigo.

Na classe String você NÃO consegue mudar o valor interno dela, mas pode mudar a sua referência.

String a = “A”;
a += “B”;

Isto resulta em: “AB”, pois é o equivalente a: a = a + “B”;

V

Valew Daniel… pultz uma “coisa simples” desse jeito e eu sempre tive essa idéia errada…

S

Como eu faço para gravar as modficações q eu fiz pelo java?

S

Ja que ninguem respondeu eu mesmo respondo

Após fazer as modificações você pode usar o seguinte código sendo o objeto doc o seu getDocumentElement( ) :wink:

Antes de mais nada

import java.io.FileOutputStream;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;

e então:

DOMSource domSrc = new DOMSource(doc);
StreamResult streamResult = new StreamResult(new FileOutputStream("arquivo.xml"));
TransformerFactory transformerFac = TransformerFactory.newInstance( );
Transformer transformer = transformerFac.newTransformer( );
transformer.transform(domSrc, streamResult);
marcioyudi

Eu estou precisando parsear arquivos RSS, o DOM da conta do recado ? E que com o SAX, eu nao sei como tratar as tags que comecam com <!. …>

Em outras palavras, eu preciso criar uma aplicacao que leia um XML no formato RSS e mostre o conteudo formatado como um leitor RSS.

marcioyudi

Como ninguem respondeu, ate agora estou conseguindo parcialmente fazer aquilo que espero. Porem agora estou precisando alterar alguns dados dos arquivos XML. O DOM da conta do recado??? Ou vou ter de aprender a usar o SAX ?

danieldestro

Sax é apenas para leitura.
DOM é o cara.

marcioyudi

So mais uma duvida: como desativar o DTD no DOM ??? E a unica coisa que esta dando problema no meu aplicativo !

Filipi_Silveira

Alguém tem algum exemplo de como gravar um arquivo XML usando DOM? Alguém conhece algum bom tutorial sobre DOM. Os que eu consegui até agora não mostram com gravar o arquivo XML.

Obrigado.

Filipi Silveira

albertongai

Caras o tutorial tá com problemas nas páginas 2 e 4 , deve ter sido devido ao problema com os backups da GUJ :confused:

danieldestro

Como este tutorial tem “apenas” 4 anos. Sugiro você procurar no Google algo mais recente.

Growth

Olá.

Como faço para criar um arquivo XML e colocar dados nele, através do DOM ?

Pedrosa

Algo mais recente:

http://xstream.codehaus.org/tutorial.html

R

Olá pessoal…
qria parabenizar pelo tutorial e pelas dicas…
pois bem…
no meu caso, eu tenho uma URL q me devolve um XML.
eu gostaria de saber como faço pra menusea-la.

Sei que é por aki…

URL urlPHP=new URL(“aqui coloco minha URL”);

URLConnection con=urlPHP.openConnection();

BufferedReader in =new BufferedReader(new InputStreamReader(con.getInputStream()));

String inputLine = null;
while ((inputLine = in.readLine()) != null) {

System.out.println(inputLine);

}

até aqui consegui apenas imprimir o xml
e para acessar seus nós? como faço?

Grato pela atenção de todos.

anderson.uem

Olá pessoal,

Eu consegui fazer esse exemplo do xml numa boa, mas
quando eu compilo ou quando eu executo o Nb me mostra
a seguinte mensagem de alerta:

Alguém sabe me dizer o que é isso?

Obrigado
Anderson

Avarak

Olá!

Li um artigo impostado aqui no Guj sobre este assunto … e fiquei com uma dúvida, qual o parse que é utilizado?
E também … como eu posso fazer a validação com base em uma DTD?

Se não me engano, utilizando o Dom4j ele já possui uma funação, um Validation para isto.
Como poderia fazer a validação utilizando o parse presente nesta especificação do DOM que foi apresentada neste artigo??

Obrigada :smiley:

G

Caros, uma dúvida:

Olhando o tutorial disponível, andei tentando fazer uma mudança, para que o mesmo resolvesse o meu problema. Tenho o seguinte XML:

<?xml version="1.0"?>
<CONSULTA>
	<COLUNA indice="01">
			<BOTAO indice="001">
				<TEXTO>Associado</TEXTO>
				<FUNDO>FFFFFF</FUNDO>
			</BOTAO>
			<BOTAO indice="002">
				<TEXTO>Dependente</TEXTO>
				<FUNDO>FFFFFF</FUNDO>
			</BOTAO>
	</COLUNA>
	<COLUNA indice="02">
			<BOTAO indice="007">
				<TEXTO>Empresa</TEXTO>
				<FUNDO>FFFFFF</FUNDO>
			</BOTAO>
			<BOTAO indice="002">
				<TEXTO>Cidades</TEXTO>
				<FUNDO>FFFFFF</FUNDO>
			</BOTAO>
	</COLUNA>
</CONSULTA>

É possível fazer com que, ao ler o conteúdo de COLUNA com o índice “01”, ele me retorne todos os nós internos deste nó? Nesse caso, deveria ser retornado os dados de BOTAO indice=“001” e BOTAO indice=“002”, além dos nós internos - o conteúdo de TEXTO e FUNDO…

Tentei criar o seguinte método:

public String lerBotoes() throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse( this.arquivo );

        org.w3c.dom.Element elem = doc.getDocumentElement();
        
        NodeList nodeColuna = elem.getElementsByTagName("COLUNA");
        
        for( int i=0; i<nodeColuna.getLength(); i++ ) {
            org.w3c.dom.Element tagPai = (org.w3c.dom.Element) nodeColuna.item( i );
            String indicePai = tagPai.getAttribute( "indice" );
            
            NodeList nodeBotoes = elem.getElementsByTagName( "BOTAO" );

        

            for( int j=0; j<nodeBotoes.getLength(); j++ ) {
                Element tagBotao = (Element) nodeBotoes.item( j );
                
                String indice = tagBotao.getAttribute( "indice" );
                String texto = getChildTagValue( tagBotao, "TEXTO" );
                String fundo = getChildTagValue( tagBotao, "FUNDO" );


                System.out.println(indicePai+"\n"+indice+"\n"+texto+"\n"+fundo+"\n");

            }
        }        
        return null;
    }

Porém, nesse caso, ele varre novamente todo o arquivo para cada ocorrência de COLUNA, exibindo os dados, mas de forma repetitiva.

Qualquer ajuda será bem vinda!

[]s
Rafael

G

Bom, acho que eu consegui resolver:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse( this.arquivo );

        org.w3c.dom.Element elem = doc.getDocumentElement();
        
        NodeList nodeColuna = elem.getElementsByTagName("COLUNA");
        
        for( int i=0; i<nodeColuna.getLength(); i++ ) {
            org.w3c.dom.Element tagPai = (org.w3c.dom.Element) nodeColuna.item( i );
            // pega os dados cadastrado para o usuario atual
            String indicePai = tagPai.getAttribute( "indice" );
            
            NodeList nodeBotoes = tagPai.getElementsByTagName("BOTAO");
            
            for( int j=0; j<nodeBotoes.getLength(); j++ ) {
                org.w3c.dom.Element tagBotao = (org.w3c.dom.Element) nodeBotoes.item( j );
                
                String indice = tagBotao.getAttribute("indice" );
                String texto = getChildTagValue( tagBotao, "TEXTO" );
                String fundo = getChildTagValue( tagBotao, "FUNDO" );

                System.out.println(indicePai +"\n"+indice+"\n"+texto+"\n"+fundo+"\n\n");
            }  
      }
}
C

Boa noite

Eu li o tutorial e funcionou perfeitamente agora tenho uma duvida, no caso onde vou aplicar esse exemplo o meu xml será gerado dinamicamente, gostaria de saber como ficaria a parte de carregar o xml ?

Se alguem sabe como fazer por favoir posta ai …

Valeu.

Ismaels

Olá, boa tarde.
Li o artigo do tutorial e outros também na web porém comigo não está funcionando. Após fazer o parse do arquivo, quando tento acessar o documento para manipular os elementos com

Document doc = db.parse( this.arquivo );   
org.w3c.dom.Element elem = doc.getDocumentElement();

recebo seguinte o erro, porém não ocorre erro no parse, só ao acessar o getDocumentElement():

#document: null

Meu código está igual aos exemplos mostrados neste post e estou compilando com Java 1.6 . Digo isso porque li que nas versões anteriores a 1.4 eram necessários jars adicionais no classpath, porém isso já não é necessário na 1.6 por exemplo.
Obrigado.

Criado 26 de outubro de 2002
Ultima resposta 26 de ago. de 2008
Respostas 27
Participantes 18