Digester

14 respostas
L

Olá pessoal,

Estou com dificuldades para lidar com o commons-digester. Eu tenho que criar uma instancia de todas as classes onde ele vai armazenar os dados do xml, certo? Criei a instancia da raiz tranquilamente, porém para os filhos nao consegui. no post
http://www.guj.com.br/forum/viewtopic.php?t=5915&highlight=digester
vendo pelo exemplo, acredito que o iterator tem a ver com popular a classe dos filhos. Estou certa?
Porém quando coloquei a linha

Iterator it =d.iterator();

deu erro de sintaxe. Qual biblioteca tenho que baixar para utiliza-lo?
E como ele diferencia um filho de outro? Por exemplo

<Biblioteca> <livro>...</livro> <revista>...</revista> <artigo>...</artigo> </Biblioteca>
sendo que cada elemento-filho tem uma classe própria?
Não sei se consegui ser clara :roll:

Espero que possam me ajudar :wink:
[]'s

14 Respostas

cv1

Nao entendi o que vc quis dizer com o uso de Iterators… vc tem um exemplo do XML que vc quer ler?

L

exemplo

<Tabelas> <Dados> <Descricao></Descricao> </Dados> <Persistencia Chave="ID"/> <Atributos> <Atributo> <Nome>x</Nome> </Atributo> <Atributo> <Nome>y</Nome> </Atributo> </Atributos> <Estados> <Estado> <Atributos> <Membro Nome="x" Visivel="true"/> <Membro Nome="y" Visivel="true"/> </Atributos> </Estado> </Estados> </Tabelas>

para ler tabelas, escrevi essa linha

Tabelas t= (Tabelas)digester.parse(arquivo);

como faco para ler os demais? Pois se escrevo por exemplo

Dados d = (Dados)digester.parse( input );

ocorre ClassCastException…

por isso que vendo no post que indiquei o link na mensagem anterior imaginei que o iterator tivesse algo a ver com a leitura dos elementos internos. :roll: Só que nao pude testar pois não sei qual biblioteca baixar para utilizar o iterator… :frowning:

cv1

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Iterator.html :wink:

Um Iterator serve para se “passear” por uma Collection (como List, Set, Map e amigas). Um exemplinho pratico:

List lista = new ArrayList(); for (Iterator i = lista.iterator(); i.hasNext();) { Atributo a = (Atributo) i.next(); a.doStuff(); }

Ficou mais facil? :slight_smile:

Como voce definiu as regras pro Digester (ou seja, quais as expressoes xpath vc passou)?

L

vc quis dizer isso?:roll:

digester.addObjectCreate( "Tabelas", Tabelas.class );

         digester.addObjectCreate( "Tabelas/Dados", Dados.class );
         digester.addSetNext( "Tabelas/Dados", "setDados" );

         digester.addObjectCreate( "Tabelas/Persistencia", Persistencia.class );
         digester.addBeanPropertySetter( "Tabelas/Persistencia/Chave", "Chave" );
				
			digester.addSetNext( "Tabelas/Persistencia", "setPersistencia" );

facilitou sim... :)mas o problema é que acho q falta a biblioteca do iterator para eu poder ¨brincar¨ com ele..:( voce sabe qual eh e onde posso baixar? :wink:

Rafael_Steil

A Iterator faz parte do java.util ( java.util.Iterator ). Vem com o J2SE ( ou seja, voce ja tem ).

Rafael

L

sim :) , pelo que li eh isso mesmo, por isso nao tinha achado onde baixa-lo

bem, no meu codigo esta assim

Tabelas t = (Tabelas)digester.parse( arquivo );
		
	Iterator it =t.iterator();

e nessa ultima linha tem erro de sintaxe nos 2 iterators escritos, dizendo que ¨Iterator cannot be resolved or is not a type¨ . Será q tou cometendo um grande erro e nao vi?
:?

Rafael_Steil

Eh que a tua classe Tabelas nao tem um metodo chamado iterator()…
O ClassCastException que deu eh pq o parse() esta retornando um objeto diferente de Tabelas.

Rafael

L

Sim :slight_smile: , o parse tah retornando um objeto Tabelas, eu estou tentando descobrir como que faz ele (o parse) retornar Dados, Persistencia, etc. também, para guardar nas respectivas classes. Eu pensei que era usando o iterator que se fazia isso . :frowning:

Rafael_Steil

Dados nao deveria fazer parte de Tabelas? digo, Tabelas nao deveria conter Dados? ou voce pretende pegar, separadamente, todos os objetos Dados?
Pq voce poderia adiconar um CallMethod na configuracao do Digester para, a cada tag <Dados> encontradada, ele chamaria um metodo que associaraia com a Tabela referente.

Bom, nao tenho mta experiencia com essa lib. Talvez o artigo http://www.onjava.com/lpt/a/2746 ajude.

Rafael

L

Hummmm entao qdo eu fiz

Tabelas t= (Tabelas)digester.parse(arquivo);

ele nao soh inseriu o dado do xml no Tabelas como no Dados tb?
Se sim… cmo que eu faco pra acessar o que está em Dados se eu nem instanciei na mao? :?:

Nos tutoriais nao encontrei como se faz o acesso aos objetos internos do xml…

Rafael_Steil

Pelo artigo do link, voce configura o digester para cada tipo de dados ( os setXxx e afins ) e o parser faz o resto… no caso, voce um objeto Dados associado a Tabelas, como em

class Tabelas {
    ...
    Dados dados;
    ...
    public void setDados() ...
}

e para acessar, apos o processamento, seria algo como

..
tabelas.getDados();

eh o lance do addBeanPropertySetter, addSetProperties etc…
Talvez tenha uma outra forma ( cv? ), mas eu ja nao conheco por falta de experiencia com o Digester :?

Rafael

L

Certo… :slight_smile: e no caso de pegar a Descricao, que é um elemento dentro do Dados? :roll:

Rafael_Steil

Algo como

class Dados {
    private String descricao;

    ...
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getDescricao() {
        return this.descricao;
    }
}
...
digester.addObjectCreate( "Tabelas/Dados", Dados.class );
digester.addBeanPropertySetter( "Tabelas/Dados/Descricao", "descricao" );
...

Rafael

L

Ah :slight_smile: , legal, brigadão :smiley:

Vou dar uma mexida agora nisso e ver se funciona tudo que quero, mas vcs me ajudaram bastante… 8)

Valeu :slight_smile:

Criado 12 de dezembro de 2003
Ultima resposta 12 de dez. de 2003
Respostas 14
Participantes 3