martes, 2 de octubre de 2012

XML Parser en Android

A la hora de analizar un fichero XML y obtener información de él, Android ofrece su propia clase parser basada en SAX org.xmlpull.v1.XmlPullParser.
Para analizar un fichero XML este primero debe colocarse en la carperta de recursos del proyecto Android. En este caso, en la carpeta raw. En caso de no existir esta carpeta debe crease e incluir el fichero XML en esta ruta.
El flujo de entrada del fichero se obtiene del contexto de la actividad, de la siguiente manera,

...
InputStream inputStream = context.getResources().openRawResource(R.raw.fichero);
  
...
Este InputStream es pasado posteriormente al parser para iniciar el análisis del fichero. La manera de obtener el parser y asignar el flujo del fichero a este se realiza como sigue:
...
  XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  factory.setNamespaceAware(true);
  XmlPullParser xpp = factory.newPullParser();
  InputStream inputStream =    context.getResources().openRawResource(R.raw.fichero);
  xpp.setInput(inputStream, null);
...

En este trozo de código se obtine un objeto XmlPullParser mediante un pattern Factory. Mediante el método setInput se asigna el fichero XML a analizar. Por último, se debe saber como recoger la información almacenada en el fichero XML. Al igualque SAX, que se maneja por eventos, aquí se debe recorrer el fichero llamando al siguiente evento de análisis mediante el método next().
...


  while (eventType != XmlPullParser.END_DOCUMENT) {
   if (eventType == XmlPullParser.START_DOCUMENT) {
    System.out.println("Start document");
   } else if (eventType == XmlPullParser.END_DOCUMENT) {
    System.out.println("End document");
    
   } else if (eventType == XmlPullParser.START_TAG) {
    
    System.out.println("Start tag " + xpp.getName() + " Text " + xpp.getText());
    
   } else if (eventType == XmlPullParser.END_TAG) {
    System.out.println("End tag " + xpp.getName() + " Text " + xpp.getText());
   } else if (eventType == XmlPullParser.TEXT) {
    System.out.println("--- Tag " + xpp.getName() + " Text " + xpp.getText());
   }
   eventType = xpp.next();
  }

...


En este ejemplo, se atiende al tipo de evento siguiente, pero también se puede acceder a distintos tipos de información como son el nombre del nodo, los atributos, etc..

No hay comentarios:

Publicar un comentario