Siguiendo con el ejemplo de parsear un documento xml, aplicación XMLParser, una vez que hemos establecido la conexión web y obtenido el texto xml a parsear, hemos de navegar por cada uno de los nodos extrayendo los parámetros de interés.
- Creamos la clase Modelo_xml en la cual se definen los métodos set y get de cada uno de los nodos en los que estamos interesados. En nuestro caso se trata de los parámetros id, nombre, cantidad, descripción y precio asociados a cada producto de nuestro almacén.
package com.example.xmlparser; public class Modelo_xml { private int id; private String nombre = ""; private String cantidad = ""; private String descripcion = ""; private String precio = ""; public void setid(int id) { this.id = id; } public void setnombre(String nombre) { this.nombre = nombre; } public void setcantidad(String cantidad) { this.cantidad = cantidad; } public void setdescripcion(String descripcion) { this.descripcion = descripcion; } public void setprecio(String precio) { this.precio = precio; } public int getid() { return id; } public String getnombre() { return nombre; } public String getcantidad() { return cantidad; } public String getdescripcion() { return descripcion; } public String getprecio() { return this.precio; } }
- Creamos la clase Producto_parsear la cual define el handler que se encargará de extraer los datos del xml.
package com.example.xmlparser; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class Producto_parsear extends DefaultHandler { // Creamos un Modelo_xml y la lista asociada List<Modelo_xml> lista = null; Modelo_xml producto_elemento = null; StringBuilder constructor; // creamos una lista de arrays donde se almacenan los nodos public void startDocument() throws SAXException { super.startDocument(); lista = new ArrayList<Modelo_xml>(); } /** * En el caso de que exista el nodo producto, creamos una instancia del * Modelo_xml */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); constructor = new StringBuilder(); if (localName.equals("producto")) { // Creamos el modelo xml producto_elemento = new Modelo_xml(); } } /** * Recorremos los nodos y almacenamos los datos */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if (localName.equals("producto")) { lista.add(producto_elemento); } else if (localName.equalsIgnoreCase("status")) { } else if (localName.equalsIgnoreCase("id")) { producto_elemento.setid(Integer.parseInt(constructor.toString())); } else if (localName.equalsIgnoreCase("nombre")) { producto_elemento.setnombre(constructor.toString()); } else if (localName.equalsIgnoreCase("cantidad")) { producto_elemento.setcantidad(constructor.toString()); } else if (localName.equalsIgnoreCase("descripcion")) { producto_elemento.setdescripcion(constructor.toString()); } else if (localName.equalsIgnoreCase("precio")) { producto_elemento.setprecio(constructor.toString()); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); String tempString = new String(ch, start, length); constructor.append(tempString); } }
- El último paso consiste en crear la clase Resultado_parsear en la cual la función parsear() se encarga de recibir el texto xml en bruto y devolver un array con los nodos encontrados. La variable datos_resultado se ha declarado al comienzo de la clase y se corresponde con el Modelo_xml
List<Modelo_xml> datos_resultado = null;
/** * La función parsear toma como parámetro de entrada el String a parsear y * devuelve un array con el valor de los nodos encontrados. * * */ public String[] parsear(String texto) { ArrayList<String> stringArrayList = new ArrayList<String>(); String[] stringArray = { "0-0-0-0-0" }; try { // Creamos un buffer de lectura donde almacenar la cadena a parsear BufferedReader buf_lectura = new BufferedReader(new StringReader( texto)); // Para poder llamar a la función parse, es necesario crear una // fuente de entrada para la entidad XML InputSource entrada = new InputSource(buf_lectura); // Creamos una instancia del handler encargado de parsear los nodos Producto_parsear parser = new Producto_parsear(); // Una manera de parsear el documento xml es usar el API SAX SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser sp = factory.newSAXParser(); XMLReader reader = sp.getXMLReader(); reader.setContentHandler(parser); // parseamos el documento xml reader.parse(entrada); datos_resultado = parser.lista; if (datos_resultado != null && !datos_resultado.isEmpty()) { android.util.Log.v("PARSEAR", "datos resultado: " + datos_resultado); // Para cada una de los nodos extraemos los datos asociados: id, // nombre, cantidad, descripción y precio for (Modelo_xml xmlRowData : datos_resultado) { if (xmlRowData != null) { int id = xmlRowData.getid(); String nombre = xmlRowData.getnombre(); String cantidad = xmlRowData.getcantidad(); String descripcion = xmlRowData.getdescripcion(); String precio = xmlRowData.getprecio(); String values = id + "-" + nombre + "-" + cantidad + "-" + precio + "-" + descripcion; stringArrayList.add(values); } else { Log.e("PARSEAR", "Valor nulo de producto"); } } stringArray = (String[]) stringArrayList .toArray(new String[stringArrayList.size()]); } else { android.util.Log.v("PARSEAR", "No se han encontrado datos a parsear: " + datos_resultado); } } catch (Exception e) { Log.e("PARSEAR", "Excepción alparsear el xml :" + e); } return stringArray; }