Jump to content
magician

[Java] Leitor de XML em DOM

Recommended Posts

magician

<?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 :)


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
joaoqalves

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


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!Queres estar na moda? Utiliza a pesquisa e evita criar um tópico desnecessário.

Share this post


Link to post
Share on other sites
magician

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"


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
joaoqalves

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");
        
    }


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!Queres estar na moda? Utiliza a pesquisa e evita criar um tópico desnecessário.

Share this post


Link to post
Share on other sites
magician

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.
        
    }


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
joaoqalves

Não te importas de dizer como fazer isso para endereços ? tipo http://www.omeusite.com/teste.xml


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!Queres estar na moda? Utiliza a pesquisa e evita criar um tópico desnecessário.

Share this post


Link to post
Share on other sites
magician

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.


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
Gurzi

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

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

Share this post


Link to post
Share on other sites
magician

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 ] ;)


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
Gonçalo_ssb

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.

Share this post


Link to post
Share on other sites
magician

Basta usares os métodos getResource ou getResourceAsStream da classe Class em que no argumento dos métodos metes uma String com o path para o ficheiro desde o package de raiz basta algo tipo

InputStream in = NomeDaClasse.class.getResourceAsStream("/code/conf.xml");

http://java.sun.com/javase/6/docs/api/java/lang/Class.html


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
Gonçalo_ssb

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();
}

Share this post


Link to post
Share on other sites
magician

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


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
Gonçalo_ssb

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;
        }

    }

Share this post


Link to post
Share on other sites
magician

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.


I haven’t lost my mind; it’s backed up on DVD somewhere!

Share this post


Link to post
Share on other sites
Knitter

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.