ClassCastException com Element e NodeList

12 respostas
J

Olá!!

Tenho um programa que lê um XML utilizando o org.w3c.dom.* Quando tento criar uma lista com os nomes das variantes que há no XML dá erro!

Parte do XML lido:

<padrao numero="7" nome="Realizar Acompanhamento" variante="S" opcional="N"> ... <variante numero="1" nome="Avaliações Educação Física"> ... <variante numero="2" nome="Avaliações Fisioterapia"> ... <variante numero="3" nome="Avaliações Terapia Ocupacional" />

Parte do código que dá erro:

public Vector getVariantes (String padrao){ Vector variantes = new Vector(); if (eVariante(padrao)){ no = getTag("padrao"); for (int i =0; i < no.getLength(); i++){ Element elemento = (Element)no.item(i); //verifica se o padrao é o mesmo passado como parametro if (elemento.getAttribute("nome").equals(padrao)){ i = no.getLength() +1; NodeList lista = elemento.getChildNodes(); for (int j=0; j&lt;lista.getLength(); j++){ elemento = (Element)lista.item(j); // ** ERRO !!! ** //define os atributos das tabelas, analisando a tag atributo if( elemento.getTagName().equals("variante")){ variantes.addElement(elemento.getAttribute("nome")); } } } } } return variantes; } Tanto no quanto lista são NodeList.

O erro na execução de “elemento = (Element)lista.item(j);”:

java.lang.ClassCastException

at gerador.XMLManager.getVariantes(XMLManager.java:208 )

at gerador.FrameGerador.elaboraPanelPadroes(FrameGerador.java:372)

at gerador.FrameGerador.btnAvancar_actionPerformed(FrameGerador.java:681)

at gerador.FrameGerador$8.actionPerformed(FrameGerador.java:191)


O que fazer?? Parece que o problema está em que lista.item(j) é um Node, mas eu preciso que ele seja um Element, para análise futura… Como resolvo isso?? Alguma dica de codificação??

12 Respostas

V

Olá, eu estou trabalhando agora num código bem parecido com o seu e estou transformando Node em Element numa boa…

Uma coisa que eu tentaria trocar(aparentemente não tá influenciando em nada, mas…) é esse “elemento” que você tá usando dentro dos loops… naquela linha que tá dando o erro tenta mudar pra Element elemento2, só pra testar…

J

Já tentei isso! O erro dado é o mesmo, e no mesmo local…

Este programa já estava em uso, porém estou fazendo algumas modificações, mas nesta parte nem mexi, não sei o que pode ser…

_fs

Cara, que eu saiba uma NodeList contém uma lista de objetos Node e não Element, por isso o CCE.

J

Mas por que o programa passa sem problemas por

Element elemento = (Element)no.item(i);

e trava em

elemento = (Element)lista.item(j);

?? Os dois tem como resultado objetos Node, e mesmo colocando um objeto diferente, como no caso de elemento2 para a segunda parte, é somente nela que trava, a primeira executa como tem de ser…

Dicas?

_fs

no = getTag(“padrao”);

O que o método getTag retorna?

J

Retorna uma NodeList.

return no = doc.getElementsByTagName(tag);

Sendo no uma variável global do tipo NodeList e doc do tipo Document. O retorno do método getElementsByTagName é uma NodeList.

_fs

Ah fui ler o Javadoc. A interface Element estende Node :smiley:

http://java.sun.com/j2se/1.4.2/docs/api/org/w3c/dom/Document.html#getElementsByTagName(java.lang.String)
http://java.sun.com/j2se/1.4.2/docs/api/org/w3c/dom/Node.html#getChildNodes()

Então … não sei qual é o problema :expressionless:

V

Pultz! Eu juro que, quando eu estava estudando isso, eu li em algum lugar que dependendo da situação eu não poderia converter o Node pra Element… mas agora eu procurei e revirei tudo e não consegui achar denovo esse site… :frowning:

J

Então, e não é só neste código que estou com este problema. Tenho uma outra classe que tem:

NodeList no_tag = padraoXML.getChildNodes(); ... Element classe = (Element)no_tag.item(j);
e que tb tá gerando a mesma exceção… java.lang.ClassCastException

O estranho é que este código está em uso, mas estou fazendo manutenção nele. Será o caso de problemas com a IDE utilizada ou versão do Java?? Sei lá…

Diogenes

:arrow: http://java.sun.com/developer/EJTechTips/2003/tt0728.html#2

Utilize alguns instanceof e acho que resolve seu problema…

V

Boa Diogenes, era exatamente desse site que eu estava me referindo, mas não conseguia encontrar!

J

Valeu gente!!! Este erro parece ter sido sanado com o instanceof!!

Agora os problemas são outros… Mas vamos por partes! :wink:

Obrigada!!

Criado 22 de fevereiro de 2005
Ultima resposta 24 de fev. de 2005
Respostas 12
Participantes 4