En este tutorial vamos a explicar como leer datos desde un fichero xml y cómo tratarlos.
El ejercicio que voy a explicar trata de leer un documento xml donde va a estar guardado los datos de los empleados, una vez que lea los datos del fichero xml la aplicación nos mostrará la edad media y el sueldo máximo y mínimo de todos los empleados que están almacenados en el fichero xml.
En ese tutorial aprenderás a:
- Crear un fichero xml básico
- Utilizar la clase XmlPullParser para leer archivos xml
Espero que le guste. Si tiene cualquier problema no dude en comentar.
¡ Saludos!
¡ Saludos!
Enlaces de interés:
Puede descargar si lo desea el código fuente de este proyecto.
Ayuda XmlPullParse
Ayuda oficial para la utilización de la clase XmlPullParse de Android, muy útil si tenemos problemas a la hora de entender su funcionamiento.
Ayuda oficial para la utilización de la clase XmlPullParse de Android, muy útil si tenemos problemas a la hora de entender su funcionamiento.
Pasos a seguir:
1. Antes de nada vamos a crear el xml que contiene los empleados que guardaremos en una carpeta que vamos a crear dentro de res, la vamos a llamar xml, por lo que la ruta sería res/xml/empleados.xml.
<?xml version="1.0" encoding="UTF-8" ?> <empresa nombre="Informática SA"> <empleados> <empleado> <nombre>Francisco</nombre> <puesto>Gerente</puesto> <edad>25</edad> <sueldo>1500</sueldo> </empleado> <empleado> <nombre>Paco</nombre> <puesto>Secretario</puesto> <edad>35</edad> <sueldo>1100</sueldo> </empleado> <empleado> <nombre>Sandra</nombre> <puesto>Informática</puesto> <edad>24</edad> <sueldo>1200</sueldo> </empleado> <empleado> <nombre>Maria</nombre> <puesto>Informática</puesto> <edad>29</edad> <sueldo>1200</sueldo> </empleado> <empleado> <nombre>Esteban</nombre> <puesto>Informático</puesto> <edad>25</edad> <sueldo>1200</sueldo> </empleado> <empleado> <nombre>Pablo</nombre> <puesto>Relaciones Públicas</puesto> <edad>21</edad> <sueldo>900</sueldo> </empleado> </empleados> </empresa>
2. Seguidamente creamos la interfaz de la activid principal que será la que nos muestre los datos, simplemente con unos TextView nos sería suficiente, un ejemplo de interfaz sería el siguiente.
3. Declaramos los campos que vamos a utilizar en la clase de la actividad principal.
4. Inicializamos la variables en el método onCreate() además de definir los método que tendremos que usar que más adelante programaremos.
5. Creamos el método que nos va a permitir obtener la edades de los empleados.
6. Creamos otro método el cual nos permitirá leer el sueldo de los empleados.
7. Una vez obtenidos lo datos del xml tendremos que calcular la edad media de los empleados, por lo que crearemos un método el cual no lo calcule a partir de los datos obtenidos.
8. También tendremos que calcular el suelo mínimo de los empleados por lo que utilizaremos el siguiente método.
9. Lo mismo tendremos que hacer para calcular el sueldo máximo, utilizaremos otro método para ello.
10. Y con el siguiente método informamos al usuario de los datos que hemos obtenidos a partir de los métodos anteriores.
Para aprender más:
Reglas de un documento XML
Un archivo xml debe de estar bien formado para ello tiene que aplicarle las siguientes reglas:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/TextView01" android:layout_width="200dp" android:layout_height="wrap_content" android:text="@string/edadMedia" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtEdadMedia" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="200dp" android:layout_height="wrap_content" android:text="@string/sueldoMinimo" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtSueldoMinimo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/TextView02" android:layout_width="200dp" android:layout_height="wrap_content" android:text="@string/sueldoMaximo" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtSueldoMaximo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> </LinearLayout> </RelativeLayout>
3. Declaramos los campos que vamos a utilizar en la clase de la actividad principal.
public class InformacionActivity extends Activity { //////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // //////////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private TextView txtEdadMedia; // Campo gráfico que muestra la edad media private TextView txtSueldoMinimo; // Campo gráfico que muestra el sueldo mínimo private TextView txtSueldoMaximo; // Campo gráfico que muestra el sueldo máximo // Otros campos private ArrayList<Integer> edades; // Almacena las edades de los empleados private ArrayList<Float> sueldos; // Almacena los sueldos de los empleados //////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////////////////
4. Inicializamos la variables en el método onCreate() además de definir los método que tendremos que usar que más adelante programaremos.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_informacion); // Inicialización de campos gráficos txtEdadMedia = (TextView) findViewById(R.id.txtEdadMedia); txtSueldoMinimo = (TextView) findViewById(R.id.txtSueldoMinimo); txtSueldoMaximo = (TextView) findViewById(R.id.txtSueldoMaximo); // Inicialización de otros campos edades = new ArrayList<Integer>(); sueldos = new ArrayList<Float>(); // Ejecución // Obtiene las edades de los empleados leerEdades(R.xml.empleados); // Obtiene los sueldos de los empleados leerSueldos(R.xml.empleados); // Muestra los datos obtenidos por pantalla escribirDatos(); }
5. Creamos el método que nos va a permitir obtener la edades de los empleados.
/** * Lee la edad de los empleados almacenados en un xml * * @param identificador El identificador del archivo xml */ public void leerEdades(int identificador){ // Campos XmlResourceParser xml; // Almacena el recurso xml int evento; // Almacena el evento recogido try { // Obtiene el recurso xml xml = getResources().getXml(identificador); // Obtiene el evento evento = xml.getEventType(); // Lee hasta el final del documento while (evento != XmlPullParser.END_DOCUMENT){ switch (evento) { case XmlPullParser.START_TAG: // Comprueba si es edad if (xml.getName().equals("edad")){ // Si es edad ... // Obtiene la edad xml.next(); edades.add(Integer.parseInt(xml.getText())); } break; } evento = xml.next(); } } catch (NotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
6. Creamos otro método el cual nos permitirá leer el sueldo de los empleados.
/** * Lee el sueldo de los empleados almacenados en un xml * * @param identificador El identificador del archivo xml */ public void leerSueldos(int identificador){ // Campos XmlResourceParser xml; // Almacena el recurso xml int evento; // Almacena el evento recogido try { // Obtiene el recurso xml xml = getResources().getXml(identificador); // Obtiene el evento evento = xml.getEventType(); // Lee hasta el final del documento while (evento != XmlPullParser.END_DOCUMENT){ switch (evento) { case XmlPullParser.START_TAG: // Comprueba si es sueldo if (xml.getName().equals("sueldo")){ // Si es sueldo ... // Obtiene la sueldo xml.next(); sueldos.add(Float.parseFloat(xml.getText())); } break; } evento = xml.next(); } } catch (NotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
7. Una vez obtenidos lo datos del xml tendremos que calcular la edad media de los empleados, por lo que crearemos un método el cual no lo calcule a partir de los datos obtenidos.
/** * Obtiene la edad media de un conjunto de edades * @param edades La lista de edades * @return La edad media obtenida */ public float calcularEdadMedia(ArrayList<Integer> edades){ // Campos int suma; // Almacena la suma de las edades suma = 0; // Inicializa la variable // Recorre las edades almacenadas for (Integer edad : edades) { suma += edad; } // Calcula y devuelve la edad media return suma / edades.size(); }
8. También tendremos que calcular el suelo mínimo de los empleados por lo que utilizaremos el siguiente método.
/** * Calcula el sueldo mínimo de un conjunto de suelods * @return El sueldo mínimo */ public float calcularSueldoMinimo(ArrayList<Float> sueldos){ // Campos float sueldoTmp ; // Almacena el sueldo mínimo sueldoTmp = calcularSueldoMaximo(sueldos); // Inicializa la variable for (Float sueldo : sueldos) { // Comprueba si el sueldo almacenado es mayot if (sueldoTmp > sueldo){ // Si es mayor ... // Guardamos el nuevo sueldo (que es menor) sueldoTmp = sueldo; } } return sueldoTmp; }
9. Lo mismo tendremos que hacer para calcular el sueldo máximo, utilizaremos otro método para ello.
/** * Calcula el sueldo máximo de un conjunto de suelods * @return El sueldo máximo */ public float calcularSueldoMaximo(ArrayList<Float> sueldos){ // Campos float sueldoTmp ; // Almacena el sueldo máximo sueldoTmp = 0; // Inicializa la variable for (Float sueldo : sueldos) { // Comprueba si el sueldo almacenado es menor if (sueldoTmp < sueldo){ // Si es menor ... // Guardamos el nuevo sueldo (que es mayor) sueldoTmp = sueldo; } } return sueldoTmp; }
10. Y con el siguiente método informamos al usuario de los datos que hemos obtenidos a partir de los métodos anteriores.
/** * Muestra los datos obtenidos al usuario */ public void escribirDatos(){ // Muestra la edad media txtEdadMedia.setText(String.valueOf(calcularEdadMedia(edades))); // Muestra el sueldo mínimo txtSueldoMinimo.setText(String.valueOf(calcularSueldoMinimo(sueldos))); // Muestra el sueldo máximo txtSueldoMaximo.setText(String.valueOf(calcularSueldoMaximo(sueldos))); }
Para aprender más:
Reglas de un documento XML
Un archivo xml debe de estar bien formado para ello tiene que aplicarle las siguientes reglas:
- Un documento XML siempre comienza con un prólogo (ver más abajo para una explicación de lo que es un prólogo)
- Cada etiqueta de apertura tiene una etiqueta de cierre.
- Todas las etiquetas están completamente anidados.
Un documento XML siempre se inicia con un prólogo que describe el archivo XML. Este prólogo puede ser mínimo, por ejemplo <? xml version = "1.0"> o puede contener otra información, por ejemplo, la codificación, por ejemplo <? xml version = "1.0" encoding = "UTF-8" standalone = "yes">
Fuente: vogella.com
FIN
Hola buenas...
ResponderEliminarLlevo días siguiendo tus tutoriales y me parecen geniales...
En este caso en concreto...que debería de cambiar para que el archivo .xml lo recogiera de una url, y no de la carpeta /res/xml?
Muy buenas y gracias.
ResponderEliminarTe he modificado un método, en concreto el de LeerEdades() para que veas un ejemplo de como se haría.
En el siguiente enlace te puedes descargar el código modificado.
Enlace -> http://www.mediafire.com/view/?e90b18wvn3b55kc
Para que todo termine de funcionar tendrás que añadirle los permisos de acceso ha internet a la aplicación que ya también te he indicado en el mismo fichero.
De todas formas también te lo explico aquí:
Para añadirle los permisos a la actividad principal tendrías que poner en el método onCreate() la siguiente línea:
// Permisos para poder acceder a internet
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Y para terminar, también tendría que añadirle el permiso de internet al manifiesto, para ello tendría que añadir esta línea fuera de la etiqueta application:
De nuevo muchas gracias y espero haber resulto tu duda.
¡ Saludos !