Android: analizador XML
XML son las siglas de Extensible Mark-up Language. XML es un formato muy popular y se usa comúnmente para compartir datos en Internet. Este capítulo explica cómo analizar el archivo XML y extraer la información necesaria de él.
Android proporciona tres tipos de analizadores XML que son DOM,SAX and XMLPullParser. Entre todos ellos, Android recomienda XMLPullParser porque es eficiente y fácil de usar. Entonces vamos a usar XMLPullParser para analizar XML.
El primer paso es identificar los campos de los datos XML que le interesan. Por ejemplo. En el XML que se proporciona a continuación, solo nos interesa obtener la temperatura.
<?xml version="1.0"?>
<current>
<city id="2643743" name="London">
<coord lon="-0.12574" lat="51.50853"/>
<country>GB</country>
<sun rise="2013-10-08T06:13:56" set="2013-10-08T17:21:45"/>
</city>
<temperature value="289.54" min="289.15" max="290.15" unit="kelvin"/>
<humidity value="77" unit="%"/>
<pressure value="1025" unit="hPa"/>
</current>
XML: elementos
Un archivo xml consta de muchos componentes. Aquí está la tabla que define los componentes de un archivo XML y su descripción.
No Señor | Descripción de Componente |
---|---|
1 | Prolog Un archivo XML comienza con un prólogo. La primera línea que contiene la información sobre un archivo es prólogo. |
2 | Events Un archivo XML tiene muchos eventos. El evento podría ser así. El documento comienza, el documento termina, el inicio de la etiqueta, el final de la etiqueta y el texto, etc. |
3 | Text Además de etiquetas y eventos, el archivo xml también contiene texto simple. ComoGB es un texto en la etiqueta del país. |
4 | Attributes Los atributos son las propiedades adicionales de una etiqueta, como el valor, etc. |
XML: análisis
En el siguiente paso, crearemos el objeto XMLPullParser, pero para crearlo, primero crearemos el objeto XmlPullParserFactory y luego llamaremos a su método newPullParser () para crear XMLPullParser. Su sintaxis se da a continuación:
private XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
private XmlPullParser myparser = xmlFactoryObject.newPullParser();
El siguiente paso implica especificar el archivo para XmlPullParser que contiene XML. Puede ser un archivo o una secuencia. En nuestro caso es un flujo, su sintaxis se da a continuación:
myparser.setInput(stream, null);
El último paso es analizar el XML. Un archivo XML consta de eventos, nombre, texto, AttributesValue, etc. Por lo tanto, XMLPullParser tiene una función separada para analizar cada componente del archivo XML. Su sintaxis se da a continuación:
int event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.END_TAG:
if(name.equals("temperature")){
temperature = myParser.getAttributeValue(null,"value");
}
break;
}
event = myParser.next();
}
El método getEventTypedevuelve el tipo de evento que ocurre. por ejemplo: inicio de documento, inicio de etiqueta, etc.getName devuelve el nombre de la etiqueta y, dado que solo estamos interesados en la temperatura, solo verificamos la declaración condicional de que si obtuvimos una etiqueta de temperatura, llamamos al método getAttributeValue para devolvernos el valor de la etiqueta de temperatura.
Aparte de estos métodos, hay otros métodos proporcionados por esta clase para analizar mejor los archivos XML. Estos métodos se enumeran a continuación:
No Señor | Método y descripción |
---|---|
1 | getAttributeCount() Este método solo devuelve el número de atributos de la etiqueta de inicio actual |
2 | getAttributeName(int index) Este método devuelve el nombre del atributo especificado por el valor del índice. |
3 | getColumnNumber() Este método devuelve Devuelve el número de columna actual, comenzando desde 0. |
4 | getDepth() Este método devuelve Devuelve la profundidad actual del elemento. |
5 | getLineNumber() Devuelve el número de línea actual, comenzando por 1. |
6 | getNamespace() Este método devuelve el URI del espacio de nombres del elemento actual. |
7 | getPrefix() Este método devuelve el prefijo del elemento actual. |
8 | getName() Este método devuelve el nombre de la etiqueta. |
9 | getText() Este método devuelve el texto de ese elemento en particular. |
10 | isWhitespace() Este método comprueba si el evento TEXT actual contiene solo caracteres de espacio en blanco. |
Ejemplo
Aquí hay un ejemplo que demuestra el uso de XML DOM Parser. Crea una aplicación básica que le permite analizar XML.
Para experimentar con este ejemplo, puede ejecutarlo en un dispositivo real o en un emulador.
Pasos | Descripción |
---|---|
1 | Utilizará Android Studio para crear una aplicación de Android en un paquete com.example.sairamkrishna.myapplication. |
2 | Modifique el archivo src / MainActivity.java para agregar el código necesario. |
3 | Modifique res / layout / activity_main para agregar los componentes XML respectivos |
4 | Cree un nuevo archivo XML en la carpeta de activos / file.xml |
5 | Modifique AndroidManifest.xml para agregar el permiso de Internet necesario |
6 | Ejecute la aplicación y elija un dispositivo Android en ejecución e instale la aplicación en él y verifique los resultados |
A continuación se muestra el contenido del archivo de actividad principal modificado MainActivity.java.
package com.example.sairamkrishna.myapplication;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView tv1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1=(TextView)findViewById(R.id.textView1);
try {
InputStream is = getAssets().open("file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
Element element=doc.getDocumentElement();
element.normalize();
NodeList nList = doc.getElementsByTagName("employee");
for (int i=0; i<nList.getLength(); i++) {
Node node = nList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element2 = (Element) node;
tv1.setText(tv1.getText()+"\nName : " + getValue("name", element2)+"\n");
tv1.setText(tv1.getText()+"Surname : " + getValue("surname", element2)+"\n");
tv1.setText(tv1.getText()+"-----------------------");
}
}
} catch (Exception e) {e.printStackTrace();}
}
private static String getValue(String tag, Element element) {
NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();
Node node = nodeList.item(0);
return node.getNodeValue();
}
}
A continuación se muestra el contenido de Assets/file.xml.
<?xml version="1.0"?>
<records>
<employee>
<name>Sairamkrishna</name>
<surname>Mammahe</surname>
<salary>50000</salary>
</employee>
<employee>
<name>Gopal </name>
<surname>Varma</surname>
<salary>60000</salary>
</employee>
<employee>
<name>Raja</name>
<surname>Hr</surname>
<salary>70000</salary>
</employee>
</records>
A continuación se muestra el contenido modificado del xml res/layout/activity_main.xml.
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
A continuación se muestra el contenido de AndroidManifest.xml archivo.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sairamkrishna.myapplication" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Intentemos ejecutar nuestra aplicación que acabamos de modificar. Supongo que habías creado tuAVDmientras realiza la configuración del entorno. Para ejecutar la aplicación desde Android Studio, abra uno de los archivos de actividad de su proyecto y haga clic en el icono Ejecutar de la barra de herramientas. Android Studio instala la aplicación en su AVD y la inicia y, si todo está bien con su configuración y aplicación, se mostrará la siguiente ventana del emulador: