Erro leitura de XML com DOM

4 respostas
A

Boa tarde eu estou lendo um XML até então sem problemas com a API DOM. Porém preciso ler em um determinado momento os nodos irmãos.

File docXMLfile = new File(this.xmlReaderPath);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(docXMLfile);
Element element = doc.getDocumentElement();	
processChildNodes(tagCube.getElementsByTagName("Dimension"));

private void processChildNodes(NodeList children)
	{
		if (children.getLength() > 0)
		{
			for (int i = 0; i < children.getLength(); i++)
			{
					dataReader(levels.item(z));				
			}
			
		}

private void dataReader(Node node)
	{
if (node.getNodeName().equals("Level"))
		{
			Element level = (Element) node;
			
			Level lvl = new Level();
			lvl.setLevelName(level.getAttribute("name"));
			lvl.setLevelColumn(level.getAttribute("column"));
			lvl.setLevelColumnType(level.getAttribute("type"));
			
			Node irmao = node.getNextSibling();	
	                Element irmaoElem = (Element) irmao;
	
}
}

Estou tentando utilizar o metodo getNextSibling que pelo que vi na documentação, ele pega o nodo irmão próximo caso ele não tenha nodos irmaos é retornado null. Porém ele tá me retornando um nodo do tipo #text e ainda quando vou tentar fazer o cast para Element ele gera um erro:

Exception in thread "main" java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredTextImpl cannot be cast to org.w3c.dom.Element
	at br.pbji.model.xml.XMLReader.dataReader(XMLReader.java:153)
	at br.pbji.model.xml.XMLReader.processChildNodes(XMLReader.java:108)
	at br.pbji.model.xml.XMLReader.cubeReader(XMLReader.java:78)
	at br.pbji.view.main.Main.main(Main.java:23)

Alguém pelo amor de deus pode me ajudar? Preciso somente ler os irmãos de um nodo... passo um nodo como parametro e tenho que descubrir quem são seus irmaos.
Obrigado pela atenção.

4 Respostas

E

Você precisa pular esses nodos do tipo text, que são os pedacinhos de texto que ficam entre os elementos. Não adianta ficar fazendo cast que não funciona.

A

e como eu pulo? :?

desculpa…

eu consegui pular adicionando mais um metodo getNextSibling

Não irei ter problemas fazendo isso?

E

Você terá problemas se não souber o que está fazendo. No seu caso, em que você só quer pegar os nodes do tipo Element, pule tudo que não é do tipo Element (por exemplo). Você pode usar um instanceof para checar se o Node é ou não um Element. Melhor usar um “while” para percorrer os irmãos até achar um Element, porque pode haver outras coisas, como comentários, até chegar ao Element.

A

Esquece o que eu falei anteriormente, eu consegui fazer muito obrigado pela ajuda!

Node n1 = node.getNextSibling();
			
			while (!(n1 instanceof Element))
			{
				n1 = n1.getNextSibling();		
				if (n1 == null)
					break;
			}
Criado 21 de setembro de 2010
Ultima resposta 21 de set. de 2010
Respostas 4
Participantes 2