Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/07/2013, 01:21
DoHITB
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Error con XML y Android

Buenas!

Tengo una pequeña clase en JAVA que lee un XML y lo "parsea" en distintos tipos de objeto, para así poder tratar dichos objetos a posteriori.

Este XML me viene desde internet, y con JAVA me funciona bien el "parseo". No obstante, usando la misma clase desde una aplicación android recibo un error...

Mi clase hace básicamente esto:

Código Java:
Ver original
  1. /**
  2.      * fill method.
  3.      * Fills data using given String array from Globals assigned file.
  4.      * Eg: fill(new String[]{"meta", "user", "activities")}
  5.      * @param curr
  6.          * @param file
  7.      * @return true if everything is ok; false otherwise
  8.      */
  9.     public boolean fill(String[] curr, String file){
  10.         try{
  11.             Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new java.io.StringReader(file)));
  12.  
  13.             doc.getDocumentElement().normalize();
  14.  
  15.             for(int i=0;i<curr.length;i++)
  16.                 this.treat((doc.getElementsByTagName(curr[i])), curr[i]);
  17.         }catch(ParserConfigurationException e){
  18.             this.error = Strings.PARSEEXCEPTION.getValue();
  19.             this.exception = e;
  20.             return false;
  21.         }catch(SAXException e){
  22.             this.error = Strings.SAXEXCEPTION.getValue();
  23.             this.exception = e;
  24.             return false;
  25.         }catch(IOException e){
  26.             this.error = Strings.IOEXCEPTION.getValue();
  27.             this.exception = e;
  28.             return false;
  29.         }
  30.  
  31.         return this.check();
  32.     }
  33.  
  34.         private void treat(NodeList nl, String kind){
  35.         for(int i=0;i<nl.getLength();i++)
  36.             this.add(nl.item(i), kind);
  37.     }
  38.  
  39.     private void add(Node n, String kind){
  40.         if(kind.equals("meta"))
  41.             this.addMeta(n);
  42.                 //más código
  43.        }
  44.  
  45.     private void addMeta(Node n){
  46.         String[] fields = {"src", "timestamp", "title", "kind", "startDate", "startWeek", "offset" , "print", "back", "forward", "fname", "lname", "ref", "crcData"};
  47.         Element e = (Element)n.getChildNodes();//AQUÍ FALLO!
  48.  
  49.         for(int i=0;i<fields.length;i++)
  50.             this.add(e.getElementsByTagName(fields[i]).item(0).getFirstChild(), "meta:"+fields[i]);
  51.     }

Y el error (en Android) me da justo cuando hago el cast a Element, me dice que hay un "ClassCastException", cuando en una ejecución JAVA normal no da error.

He leído que puede ser por los espacios en blanco o saltos de línea, pero el XML que recibo está en una sola línea y sin espacios en blanco...

Haciendo debug he intentado hacer lo siguiente - en el apartado de eclipse "expressions":

n.getChildNodes() => NodeList (long. 4)
(Element)n.getChildNodes.item(0) => Element
(Element)n.getChildNodes.item(1) => Element
(Element)n.getChildNodes.item(2) => Element
(Element)n.getChildNodes.item(3) => Element

Así que en principio se pueden hacer el cast.

Entonces, ¿quizás debería cambiar la línea que me da el error por algún tipo de bucle que me compruebe con un "if" si se puede hacer el cast y (si se puede) añadirlo a alguna lista?

El tema es que he probado de hacer algo así, pero no se que tipo de dato usar ya que ni Element, ni Node, ni NodeList, ni NodeImpl se pueden instanciar...

Desde ya gracias por cualquier info. que me podáis dar.

Un saludo!