Парсинг xml-файла с помощью XmlPullParser

| 01.08.2014

В данной статье мы рассмотрим простейший пример парсинга xml-данных с помощью XmlPullParser. Данные мы поместим в xml-файл. Местоположение файла — res/xml/people.xml (директорию xml нужно создать).

Содержимое xml-файла:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<people>
    <person>
        <company>ATT</company>
        <name>Andrew Poleshuk</name>
        <city>USA</city>
        <phone os="Android" version="4.4">yes</phone>
        <travel>
            <country>Russia</country>
            <country>Ukraine</country>
            <country>Turkey</country>
        </travel>
    </person>
</people>

Для парсинга будем использовать библиотеку XmlPullParser. Этот парсер последовательно проходится по документу xml (перебирает все теги в цикле while). Каждый новый тег — это некое «событие», в зависимости от типа которого мы можем понять, с чем имеем дело:

- начальный тег XmlPullParser.START_TAG
- закрывающий тег XmlPullParser.END_TAG
- текстовое содержимое тега XmlPullParser.TEXT

Пример перебора всех элементов документа xml, включая атрибуты и вложенные теги:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package ru.androiddocs.xmlpullparserexample;
 
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
 
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
 
import java.io.IOException;
 
 
public class MainActivity extends ActionBarActivity {
 
    private static final String LOG_TAG = "my_tag";
    private String mTempStr = "";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        try {
            // создаем XmlPullParser
            XmlPullParser mParser = getResources().getXml(R.xml.people);
            // перебираем все теги
            while (mParser.getEventType() != XmlPullParser.END_DOCUMENT) {
                switch (mParser.getEventType()) {
                    // если это начало документа
                    case XmlPullParser.START_DOCUMENT:
                        Log.d(LOG_TAG, "START_DOCUMENT");
                        break;
                    // если это начало тэга
                    case XmlPullParser.START_TAG:
                        Log.d(LOG_TAG, "START_TAG: имя тэга = " + mParser.getName()
                                + ", глубина = " + mParser.getDepth() + ", число атрибутов = "
                                + mParser.getAttributeCount());
                        mTempStr = "";
                        for (int i = 0; i < mParser.getAttributeCount(); i++) {
                            mTempStr = mTempStr + mParser.getAttributeName(i) + " = "
                                    + mParser.getAttributeValue(i) + ", ";
                        }
                        if (!TextUtils.isEmpty(mTempStr))
                            Log.d(LOG_TAG, "Атрибyты: " + mTempStr);
                        break;
                    // если это конец тэга
                    case XmlPullParser.END_TAG:
                        Log.d(LOG_TAG, "END_TAG: имя = " + mParser.getName());
                        break;
                    // если это содержимое тэга
                    case XmlPullParser.TEXT:
                        Log.d(LOG_TAG, "текст = " + mParser.getText());
                        break;
 
                    default:
                        break;
                }
                // переходим к следующему элементу
                mParser.next();
            }
 
        // ловим ошибки (исключения)
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
}

Как видите, вся логика находится внутри конструкции while, где мы обрабатываем каждый тег в соответствующем блоке case.

Код activity_main.xml я здесь не привожу, добавьте любое наполнение. Содержимое xml-файла выводим в логи:

Парсинг xml-файла с помощью XmlPullParser

Если нужно просто вывести все текстовое содержимое без тегов и атрибутов (например, если содержимое тегов однородное и используется для списка ListView), то код можно упростить:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class MainActivity extends ActionBarActivity {
 
    private static final String LOG_TAG = "my_tag";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        try {
            XmlPullParser mParser = getResources().getXml(R.xml.people);
            while (mParser.getEventType() != XmlPullParser.END_DOCUMENT) {
                switch (mParser.getEventType()) {
                    case XmlPullParser.TEXT:
                        Log.d(LOG_TAG, mParser.getText());
                        break;
                    default:
                        break;
                }
                mParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
}

Парсинг xml-файла с помощью XmlPullParser

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*