Conectamos con url usando HttpClient

Siguiendo con el ejemplo de parsear un documento xml, aplicación XMLParser, el primer paso es establecer conexión con la url donde se encuentra el documento xml.

Seguimos los siguientes pasos:

  1. En el fichero AndroidManifest.xml incluimos el permiso de acceso a internet
    <uses-permission android:name="android.permission.INTERNET"
  2. Creamos la función connect() que se encargará de conectar con la url indicada y obtener la cadena del fichero xml a parsear. La variable cadena_url es global y es declarada al comienzo de la clase. La variable xml_text también es global y es declarada junto con cadena_url. El método GET nos permite recuperar los datos asociados a la url.
    public String xml_text = null;
    public String cadena_url = "http://www.hhapp.es/portal/prueba_parsear.xml";
    
    /**
     * La función connect() crea un cliente http a la url indicada (cadena_url),
     * recoge la respuesta y la transforma en un String que contiene el
     * documente xml a parsear
     */
    private void connect() {
    
    	try {
    	// Creamos el cliente http
    	DefaultHttpClient cliente = new DefaultHttpClient();
    	// Nos conectamos a la url
    	HttpGet peticion = new HttpGet(cadena_url);
    	// Recogemos la respuesta y la trasnformamos en un string
    	HttpResponse respuesta = cliente.execute(peticion);
    	HttpEntity entidad = respuesta.getEntity();
    	String cadena = EntityUtils.toString(entidad);
    
    	// Asociamos la cadena leida a nuestro String para parsear
    	xml_text = cadena;
    
    	// Mostramos en el log de la aplicación el texto recogido
    	android.util.Log.v("PARSEAR", "Cadena xml" + cadena);
    
    	} catch (ClientProtocolException e) {
    		Log.e("PARSEAR", e.getLocalizedMessage());
    	} catch (IOException e) {
    		Log.e("PARSEAR", e.getLocalizedMessage());
    }
    
  3. Es importante destacar que la función connect() ha de ejecutarse en background y como una tarea asíncrona. En caso de que intentemos ejecutarla desde el hilo principal de ejecución de la aplicación obtendremos errores. Podemos usar el siguiente código para llamar a la función connect()
    /**
     * Esta clase se ejecuta de manera asíncrona y en background. Si lo
     * intentamos hacer en el hijo principal de ejecución obtendremos una
     * Excepción no deseada
     * 
     */
    private class Connection extends AsyncTask {
    
    	@Override
    	protected Object doInBackground(Object... arg0) {
    		connect();
    		return null;
    	}
    
    }
    
  4. La clase XMLParser quedaría de la siguiente manera:
    package com.example.xmlparser;
    
    import java.io.IOException;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.widget.EditText;
    
    public class XmlParser extends Activity {
    
    	// Declaramos la como un string el texto xml a parsear
    	public String xml_text = null;
    	public String cadena_url = "http://www.hhapp.es/portal/prueba_parsear.xml";
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_xml_parser);
    
    		// Llamos a la función Connection la cual se ejectua de manera
    		// asíncrona.
    		new Connection().execute();
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		getMenuInflater().inflate(R.menu.xml_parser, menu);
    		return true;
    	}
    
    	/**
    	 * Called when the user clicks the parser_button button. Toma el texto a
    	 * pasear como un String y se lo pasa a la clase Resultado_parsear.class la
    	 * cual se encarga de navegar nodo por nodo para extraer los datos
    	 * */
    	public void onParserclick(View view) {
    		// Recogemos los valores seleccionados por el usuario
    
    		Intent intent = new Intent(this, Resultado_parsear.class);
    
    		EditText editText = (EditText) findViewById(R.id.xml_string_txt);
    		String texto = editText.getText().toString();
    
    		// Escribimos al LogCat los valores recogidos
    		android.util.Log.v("Parsear", "texto a parsear " + texto);
    		
    		intent.putExtra("texto", xml_text);
    		startActivity(intent);
    
    	}
    
    	/**
    	 * Called when the user clicks the show_button button Se encarga de mostrar
    	 * en la venta principal la cadena de texto que será parseada
    	 * */
    	public void onShowclick(View view) {
    
    		EditText editText = (EditText) findViewById(R.id.xml_string_txt);
    		editText.setText(xml_text);
    
    	}
    
    	/**
    	 * Esta clase se ejecuta de manera asíncrona y en background. Si lo
    	 * intentamos hacer en el hijo principal de ejecución obtendremos una
    	 * Excepción no deseada
    	 * 
    	 */
    	private class Connection extends AsyncTask {
    
    		@Override
    		protected Object doInBackground(Object... arg0) {
    			connect();
    			return null;
    		}
    
    	}
    
    	/**
    	 * La función connect() crea un cliente http a la url indicada (cadena_url),
    	 * recoge la respuesta y la transforma en un String que contiene el
    	 * documente xml a parsear
    	 */
    	private void connect() {
    
    		try {
    			// Creamos el cliente http
    			DefaultHttpClient cliente = new DefaultHttpClient();
    			// Nos conectamos a la url
    			HttpGet peticion = new HttpGet(cadena_url);
    			// Recogemos la respuesta y la trasnformamos en un string
    			HttpResponse respuesta = cliente.execute(peticion);
    			HttpEntity entidad = respuesta.getEntity();
    			String cadena = EntityUtils.toString(entidad);
    
    			// Asociamos la cadena leida a nuestro String para parsear
    			xml_text = cadena;
    
    			// Mostramos en el log de la aplicación el texto recogido
    			android.util.Log.v("PARSEAR", "Cadena xml" + cadena);
    
    		} catch (ClientProtocolException e) {
    			Log.e("PARSEAR", e.getLocalizedMessage());
    		} catch (IOException e) {
    			Log.e("PARSEAR", e.getLocalizedMessage());
    		}
    	}
    
    }
    

mónica