Ejemplo de documento XML que se va a descargar:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<items>
    <item>
        <id>1</id>
        <astring>uno</astring>
        <anumber>1</anumber>
        <adate>2016-04-11T22:11:26.715+02:00</adate>
    </item>
    <item>
        <id>2</id>
        <astring>dos</astring>
        <anumber>22</anumber>
        <adate>2016-04-11T22:11:26.722+02:00</adate>
    </item>
    <item>
        <id>3</id>
        <astring>tres</astring>
        <anumber>333</anumber>
        <adate>2016-04-03T22:11:33.722+02:00</adate>
    </item>
    <item>
        <id>4</id>
        <astring>cuatro</astring>
        <anumber>4444</anumber>
        <adate>2016-04-04T22:11:44.722+02:00</adate>
    </item>
    <item>
        <id>5</id>
        <astring>cinco</astring>
        <anumber>55555</anumber>
        <adate>2016-04-05T22:11:55.722+02:00</adate>
    </item>
</items>

Clase de ejemplo asociada a los datos del documento XML:

import java.util.Date;

public class Item {
    public int id;
    public String astring;
    public int anumber;
    public Date adate;

    public Item(int id, String astring, int anumber, Date adate) {
        this.id = id;
        this.astring = astring;
        this.anumber = anumber;
        this.adate = adate;
    }
}

Clase de una Activity que descarga los datos que se encuentren en un documento XML (como el mostrado anteriormente) alojado en Internet. Los datos descargados se mostrarán por la salida estándar:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

/*
Requiere añadir permiso de acceso a Internet. Colocar la siguiente línea en el archivo
AndroidManifest.xml antes de </manifest>:
    <uses-permission android:name="android.permission.INTERNET" />
*/

public class MainActivity extends AppCompatActivity {

    // TODO: Indicar la URL donde se encuentre el documento XML
    private static final String URL = "http://javiergarciaescobedo.es/ejemplos/xml/items.xml";
    // TODO: Especificar la lista de objetos donde se desean almacenar los datos que se descarguen
    private List<Item> items = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new DownloadXmlTask().execute(URL);
    }

    private class DownloadXmlTask extends AsyncTask<String, Void, Integer> {
        @Override
        protected Integer doInBackground(String... urls) {
            try {
                InputStream stream = null;
                try {
                    stream = downloadUrl(urls[0]);
                    MyXmlParser myXmlParser = new MyXmlParser();
                    items = myXmlParser.parse(stream);
                } finally {
                    if (stream != null) {
                        stream.close();
                    }
                }
                // Descarga correcta
                return 0;
            } catch (IOException e) {
                // Error de conexión
                return 1;
            } catch (XmlPullParserException e) {
                e.printStackTrace();
                // Error en los datos
                return 2;
            }
        }

        @Override
        protected void onPostExecute(Integer resultCode) {
            switch(resultCode) {
                case 0:
                    // TODO: Realizar aquí el tratamiento oportuno de la lista de objetos que se
                    //  ha descargado
                    for (Item item : items) {
                        String result = "";
                        result += "\nid=" + item.id + "; ";
                        result += "astring=" + item.astring + "; ";
                        result += "anumber=" + item.anumber + "; ";
                        result += "adate=" + item.adate + "; ";
                        System.out.println(result);
                    }
                    break;
                case 1:
                    // TODO: Mostrar los mensajes de error en el lugar oportuno
                    Log.w(this.getClass().getName(), "Error de conexión");
                    break;
                case 2:
                    Log.w(this.getClass().getName(), "Error en los datos");
                    break;
            }
        }
    }

    // Given a string representation of a URL, sets up a connection and gets
    // an input stream.
    private InputStream downloadUrl(String urlString) throws IOException {
        //(No hace el import automáticamente ¿?) import java.net.URL;
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        conn.connect();
        return conn.getInputStream();
    }

}

Clase MyXMLParser que se encarga de reconocer el contenido del documento XML convirtiéndolo a objetos Java de la clase que se ha definido al inicio de este artículo:

import android.util.Xml;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MyXmlParser {

    private static final String ns = null; // We don't use namespaces

    // TODO: Especificar las etiquetas generales que se usan en el documento XML
    private String XML_START_TAG = "items";
    private String ELEMENT_TAG = "item";

    public List parse(InputStream in) throws XmlPullParserException, IOException {
        try {
            XmlPullParser parser = Xml.newPullParser();
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            parser.setInput(in, null);
            parser.nextTag();
            return parseXMLDocument(parser);
        } finally {
            in.close();
        }
    }

    private List parseXMLDocument(XmlPullParser parser) throws XmlPullParserException, IOException {
        List entries = new ArrayList();

        parser.require(XmlPullParser.START_TAG, ns, XML_START_TAG);
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String tagName = parser.getName();
            // Starts by looking for the entry tag
            if (tagName.equals(ELEMENT_TAG)) {
                entries.add(readEntry(parser));
            } else {
                skip(parser);
            }
        }
        return entries;
    }

    // TODO: Retornar el tipo de objeto que se va descargar
    private Item readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
        // TODO: Crear una variable para cada atributo de los objetos a descargar
        int id = 0;
        String astring = null;

        parser.require(XmlPullParser.START_TAG, ns, ELEMENT_TAG);
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String tagName = parser.getName();
            // TODO: Preguntar por cada posible etiqueta que se encuentra en los elementos XML
            if (tagName.equals("id")) {
                // TODO: Leer el contenido indicando de nuevo la etiqueta, y convirtiendo si es necesario
                id = Integer.valueOf(readContent(parser, "id"));
            } else if (tagName.equals("astring")) {
                astring = readContent(parser, "astring");
            } else {
                skip(parser);
            }
        }
        // TODO: Retornar un objeto creado a partir de las variables anteriores
        return new Item(id, astring, 0, null);
    }

    private String readContent(XmlPullParser parser, String tag) throws IOException, XmlPullParserException {
        String result = "";
        parser.require(XmlPullParser.START_TAG, ns, tag);
        if (parser.next() == XmlPullParser.TEXT) {
            result = parser.getText();
            parser.nextTag();
        }
        parser.require(XmlPullParser.END_TAG, ns, tag);
        return result;
    }

    private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            throw new IllegalStateException();
        }
        int depth = 1;
        while (depth != 0) {
            switch (parser.next()) {
                case XmlPullParser.END_TAG:
                    depth--;
                    break;
                case XmlPullParser.START_TAG:
                    depth++;
                    break;
            }
        }
    }

}