Работаем с XML-документами

Библиотеки Android имеют набор классов для работы с XML-документами с произвольной структурой и содержанием. Поддерживаются технологии SAX (Simple API for XML), XML Pull Parser, Limited DOM Level 2 core support.

Чтобы упаковать статический XML-документ вместе с вашим приложением, поместите его в каталог res/xml/. Вы получите возможность обращаться в коде программы к этому документу (операции чтения и записи). Рассмотрим загрузку XML-документа произвольной структуры из ресурсов в код программы.

Создадим пример приложения, способный читать список имен котов и их домашних телефонов, определенных в XML-файле.

В каталоге res/ создайте подкаталог xml/, в котором будет располагаться наш ХМL-файл. В этом файле мы напишем список котов и телефонов, и сохраним его под именем contacts.xml.


<contacts>
	<contact 
		first_name="Кот" 
		last_name="Рыжик"
		phone="4516585"/>
	<contact 
		first_name="Кот"
		last_name="Барсик"
		phone="4558963"/>
	<contact 
		first_name="Кошка"
		last_name="Мурка"
		phone="6254147"/>
	<contact 
		first_name="Кот"
		last_name="Бегемот"
		phone="06666660"/>
</contacts>

Разметка будет состоять из LinearLayout и ListView (main.xml):


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:drawSelectorOnTop="false" />

</LinearLayout>

Загрузить файл contacts.xml, созданный ранее, можно следующим образом:


XmlPullParser parser = getResources().getXml(R.xml.contacts);

Метод getXml() возвращает XmlPullParser, используя который можно прочитать загруженный XML-документ в цикле while:


while (parser.getEventType()!= XmlPullParser.END_DOCUMENT) {
    if (parser.getEventType() == XmlPullParser.START_TAG
            && parser.getName().equals("contact")) {
        list.add(parser.getAttributeValue(0) + " "
                + parser.getAttributeValue(1) + "\n"
                + parser.getAttributeValue(2));
    }
    parser.next();
}

У элемента contact мы определили три атрибута first_name, last_name и phone, которые загружаются в список. Первые два атрибута разделяем пробелом, а третий атрибут (номер телефона) выводим на новой строке.

Полностью код выглядит следующим образом:


package ru.alexanderklimov.xmldocument;

import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Toast;

public class XMLDocumentActivity extends ListActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ArrayList list = new ArrayList();
        
        try {
            XmlPullParser parser = getResources().getXml(R.xml.contacts);

            while (parser.getEventType()!= XmlPullParser.END_DOCUMENT) {
                if (parser.getEventType() == XmlPullParser.START_TAG
                        && parser.getName().equals("contact")) {
                    list.add(parser.getAttributeValue(0) + " "
                            + parser.getAttributeValue(1) + "\n"
                            + parser.getAttributeValue(2));
                }
                parser.next();
            }
        }
        catch (Throwable t) {
            Toast.makeText(this, 
                    "Ошибка при загрузке XML-документа: " + t.toString(), 4000)
                .show();
        }
        
        setListAdapter(new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_1, list));
    }
}