Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

XmlResourceParser: разбор XML-документа из ресурсов

Интерфейс android.content.res.XmlResourceParser позволяет извлечь данные из XML-файла, который находится в ресурсах приложения. Создадим в папке res/xml новый файл aboutcats.xml следующего содержания.


<?xml version="1.0" encoding="utf-8"?>
<cats-root>
    <cat>
        Барсик
        <color>Полосатый</color>
    </cat>
    <cat>
        Рыжик
        <color>Рыжий</color>
    </cat>
</cats-root>

В этом файле есть корневой элемент cats-root и дочерние элементы cat, внутри которых есть еще дочерний элемент color. Посмотрим, как справится с этой задачей XmlResourceParser.

Добавим на экран текстовую метку, в которой будем выводить результат разбора документа из ресурсов и напишем код:


package ru.alexanderklimov.XmlResourceParser;

import android.app.Activity;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

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

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

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

        TextView xmlContentTextView = (TextView) findViewById(R.id.textView);
        String xmlContent;
        try {
            xmlContent = getEventsFromXML(this);
            xmlContentTextView.setText(xmlContent);
        } catch (XmlPullParserException | IOException e) {
            e.printStackTrace();
        }
    }

    private String getEventsFromXML(Activity activity)
            throws XmlPullParserException, IOException {
        StringBuilder stringBuilder = new StringBuilder();
        Resources res = activity.getResources();
        XmlResourceParser xmlResourceParser = res.getXml(R.xml.aboutcats);
        xmlResourceParser.next();
        int eventType = xmlResourceParser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_DOCUMENT) {
                stringBuilder.append("Начало XML");
            } else if (eventType == XmlPullParser.START_TAG) {
                stringBuilder.append("\nSTART_TAG: ").append(xmlResourceParser.getName());
            } else if (eventType == XmlPullParser.END_TAG) {
                stringBuilder.append("\nEND_TAG: ").append(xmlResourceParser.getName());
            } else if (eventType == XmlPullParser.TEXT) {
                stringBuilder.append("\nTEXT: ").append(xmlResourceParser.getText());
            }
            eventType = xmlResourceParser.next();
        }
        stringBuilder.append("\nКонец XML");

        return stringBuilder.toString();
    }
}

В результате мы получим следующую картину:

XmlResourceParser

Ничто не мешает прочитать другие xml-файлы приложения, например, activity_main.xml, отвечающий за разметку активности:


// закоментируем эту строчку
// XmlResourceParser xmlResourceParser = res.getXml(R.xml.aboutcats);
XmlResourceParser xmlResourceParser = res.getXml(R.layout.activity_main); // парсим файл разметки

Студия находит ошибку в этом коде, но проект запускается.

Дополнительное чтение

XML Pull Parser

Реклама