Parseamos el documento xml

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.

  1. 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;
    	}
    
    }
    
  2. 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);
    	}
    }
    
  3. 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;
    }
    

mónica