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:
- En el fichero AndroidManifest.xml incluimos el permiso de acceso a internet
<uses-permission android:name="android.permission.INTERNET"
- 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()); }
- 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; } }
- 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()); } } }