• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

magician

[Java] Leitor de XML em DOM

16 mensagens neste tópico

<?xml version="1.0"?>
<Lista>
<Site>
	<Nome>Google</Nome>
	<Link>http://www.google.pt</Link>
</Site>
<Site>
	<Nome>P@P</Nome>
	<Link>http://www.portugal-a-programar.pt/</Link>
</Site>
<Site>
	<Nome>Java</Nome>
	<Link>http://java.sun.com</Link>
</Site>
</Lista>

import java.io.File;

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

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

      public void leitor(String ficheiro) {
	try {
		File file = new File(ficheiro);
		DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document doc = builder.parse(file);

		NodeList nodes = doc.getElementsByTagName("Site");
		for (int i = 0; i < nodes.getLength(); i++) {
			Element elemento = (Element) nodes.item(i);

			NodeList nome = elemento.getElementsByTagName("Nome");

			Element linha = (Element) nome.item(0);
			System.out.println("Nome : " + linha.getTextContent());

			NodeList link = elemento.getElementsByTagName("Link");
			linha = (Element) link.item(0);
			System.out.println("Link : " + linha.getTextContent());

		}
	}
	catch (Exception e) {
		System.out.println("Erro na leitura : "+e.getMessage());
	}
}

Este pequeno método faz a leitura do ficheiro XML apresentado utilizando a API DOM, como podem ver o processo é bastante simples e rapido.

O output esperado será

Nome : Google
Link : http://www.google.pt
Nome : P@P
Link : http://www.portugal-a-programar.org/forum
Nome : Java
Link : http://java.sun.com

Qualquer duvida é só dizer :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas amigo, para fazer isso, onde especificamos a pasta / URL do ficheiro? era fixe se me explicasses isso ..já que me estou a iniciar ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas amigo, para fazer isso, onde especificamos a pasta / URL do ficheiro? era fixe se me explicasses isso ..já que me estou a iniciar ;)

Tens de criar o método main isto é apenas um exemplo de um método de leitura, basta dares no argumento do método o caminho para o ficheiro tipo "/home/magician/ficheiro.xml"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ah OK, isso é só uma 'função' , tipo eu tenho de fazer isto:

package xmlreader;

import java.io.File; 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public void leitor(String ficheiro) {
	try {
		File file = new File(ficheiro);
		DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document doc = builder.parse(file);

		NodeList nodes = doc.getElementsByTagName("Site");
		for (int i = 0; i < nodes.getLength(); i++) {
			Element elemento = (Element) nodes.item(i);

			NodeList nome = elemento.getElementsByTagName("Nome");

			Element linha = (Element) nome.item(0);
			System.out.println("Nome : " + linha.getTextContent());

			NodeList link = elemento.getElementsByTagName("Link");
			linha = (Element) link.item(0);
			System.out.println("Link : " + linha.getTextContent());

		}
	}
	catch (Exception e) {
		System.out.println("Erro na leitura : "+e.getMessage());
	}
}



public class Main {

    public Main() {
    }


    public static void main(String[] args)throws Exception { 
              
    leitor("http://localhost/teste.xml");
        
    }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não isso não é C++ ou C# ou D é Java tens de meter os método dentro de uma classe não existem métodos soltos ;)

package xmlreader;

import java.io.File; 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class Main {

    public Main() {
    }
    
    public static void leitor(String ficheiro) {
	try {
		File file = new File(ficheiro);
		DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document doc = builder.parse(file);

		NodeList nodes = doc.getElementsByTagName("Site");
		for (int i = 0; i < nodes.getLength(); i++) {
			Element elemento = (Element) nodes.item(i);

			NodeList nome = elemento.getElementsByTagName("Nome");

			Element linha = (Element) nome.item(0);
			System.out.println("Nome : " + linha.getTextContent());

			NodeList link = elemento.getElementsByTagName("Link");
			linha = (Element) link.item(0);
			System.out.println("Link : " + linha.getTextContent());

		}
	}
	catch (Exception e) {
		System.out.println("Erro na leitura : "+e.getMessage());
	}
}

    public static void main(String[] args)throws Exception { 
              
    leitor("/home/teste.xml"); //Tem de ser ficheiro não endereço podes alterar o método mas ele foi feito para ler ficheiros e não endereços.
        
    }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não tenho agora hipótese de fazer o código mas isso é fácil é só dois passo primeiro fazer um URL e fazes getInputStream

http://java.sun.com/javase/6/docs/api/java/net/URL.html

Depois usas esse InputStream para dar como argumento ao DocumentBuilder

http://java.sun.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilder.html

e depois o resto é igual ao do ficheiros que mostrei.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

não percebi esta parte.. como é que se pode ter dois métodos seguidos...??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

não percebi esta parte.. como é que se pode ter dois métodos seguidos...??

Isso é o mesmo que teres

DocumentBuilder builder = ( DocumentBuilderFactory.newInstance() ).newDocumentBuilder();

O primeiro método retorna um objecto e depois é feito um pedido (método).

Nunca usaste new A("asdad").getNome().toCharArray() [ 0 ] ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá boa tarde,

Talvez não seja oportuno colocar esta dúvida aqui, mas pegando no contexto original, ou seja, utilizando o exemplo excelente que utilizan DOM para ler XML, eu estou neste momento a utilizar esta técnica e funciona perfeitamente para o String file = "C://config.xml";.

Contudo eu queria incorporar este ficheiro no meu package (nome: code) de modo a estar sempre presente, e já tentei mil caminhos e ele não consegue ir lá buscar. Eu coloquei por exemplo String file = "/code/confi.xml".

Agradeço ajuda.

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Compreendi e vou testar assim que tenha tempo, contudo como irá ser adaptado o teu exemplo uma vez que estás a fazer com a class File.

try {
         File file = new File(ficheiro);
         DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
         Document doc = builder.parse(file);
}
catch(IOExceprion e)
{
e.getMessage();
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes adaptar o se fores ver à API do DocumentBuilder o método parse pode também receber um InputStream

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como indicado consegui adaptar a para o DocumentBuider receber um InputStream, contudo segui agora surge o problema que não consigo escrever no ficheiro novamente porque o FileWriter não aceita InputStream, deixo aqui o código:

public boolean set_dados_configuracao(String directoria,boolean ckecked)
    {
       
        String backup = new Boolean(ckecked).toString();
        //Abre o ficheiro XML
        InputStream in = option_window.class.getResourceAsStream(file);
        try
        {
            
            dbf = DocumentBuilderFactory.newInstance();
            db = dbf.newDocumentBuilder();

            doc = db.parse(in);
            
            //Obtém o elemento "automatico"
            nodelist1 = doc.getElementsByTagName("automatico");
            //Retira o valor que está associado á Tag automatico
            nodelist1.item(0).setTextContent(backup);

            transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");

            StreamResult result = new StreamResult(new StringWriter());
            DOMSource source = new DOMSource(doc);
            transformer.transform(source, result);

            String xmlString = result.getWriter().toString();
            
            FileWriter out = new FileWriter(in); //Problema aqui
            //out.write(xmlString);
            //out.close();

            return true;
        }
        catch(Exception e)
        {
            //Não foi possivél alterar os dados
            return false;
        }

    }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois para escrever :S não sei se dará :| Se dá não sei como fazer :S Normalmente nesses casos uso um ficheiro externa ao jar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Escrever um ficheiro dentro do jar será mais complicado. Um jar é um ficheiro compactado em formato zip com um ficheiro manifest dentro.

Tipicamente, escrever para dentro de um ficheiro compactado implica escrever para algures no disco e copiar esse ficheiro para dentro do zip de forma a substituir o ficheiro original.

Dá uma vista de olhos à documentação sobre jars, especialmente a classe http://java.sun.com/j2se/1.5.0/docs/api/java/util/jar/package-summary.html.

Que eu conheça, não há forma de escrever directamente para um ficheiro que existe dentro de um arquivo compactado, é sempre necessário extrair o ficheiro e colocá-lo de novo no arquivo substituindo o original ou, na pior das hipóteses, recriar o arquivo cada vez que alteras algo, o que não é viável.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora