Работаем с 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));
}
}

