Создание и анализ XML-документов на платформе Android 3.0

Использование одних и тех же API построителя, синтаксического анализатора и преобразователя для XML и Android

Android, наиболее популярная платформа смартфонов, работает также и на планшетах. XML - стандартное средство обмена данными. Для синтаксического анализа и преобразования стандартного XML и для Android можно использовать одни и те же API построителя, синтаксического анализатора и преобразователя. С помощью javax.xml.parsers.DocumentBuilder можно создать объект org.w3c.dom.Document. В этой статье мы создадим и выполним анализ XML-документа на Android-устройстве с помощью объекта DocumentBuilder, полученного из DocumentBuilderFactory. Синтаксический анализ XML-документа будем выполнять с помощью расширения принимающего парсера (pull parser) XML.

Дипак Вохра (Deepak Vohra), консультант, независимый

Дипак Вохра (Deepak Vohra) - Web-разработчик, независимый консультант, сертифицированный программист Java (Sun) и сертифицированный разработчик Web-компонентов (Sun). Статьи Дипак публиковались на сайтах ONJava.com, java.net, XML Journal и Oracle Magazine.



02.07.2012

Введение

Android, наиболее популярная платформа смартфонов, работает как на смартфонах, так и на планшетах. Motorola XOOM ― это Android-планшет. Эта статья учит создавать и выполнять синтаксический анализ XML-документа на Android-устройстве. Для вывода XML можно использовать стандартный класс javax.xml.transform.Transformer. Для XML-анализа на Android можно использовать модель DOM и SAX-парсеры. Альтернативой для XML-анализа может также служить принимающий парсер org.xmlpull.v1.XmlPullParser. В примерах из этой стати для обработки XML используется Android Platform 3.0.

Загрузите пример приложения, используемый в этой статье.


Настройка среды программирования

Чтобы следить за примерами из этой статьи, установите и настройте следующее программное обеспечение (см. ссылки в разделе Ресурсы).

Часто используемые сокращения

  • ADT: Android Developer Tools
  • API: Application Programming Interface – интерфейс программирования приложений
  • AVD: Android Virtual Device - виртуальные устройства Android
  • DOM: Document Object Model
  • IDE: Integrated development environment - интегрированная среда разработки
  • JSON: JavaScript Object Notation
  • SAX: Simple API for XML – образец API для XML
  • SDK: Software Development Kit – комплект программного обеспечения разработчика
  • UI: User Interface – интерфейс пользователя
  • XML: Extensible Markup Language
  1. Установите IDE Eclipse.
  2. Установите плагин Android Development Tools(ADT) для Eclipse, который обеспечивает набор расширений для разработки Android-приложений в Eclipse.
  3. Загрузите и установите Android SDK Platform с инструментами для разработки Android-приложений.
  4. Выберите Window > Android SDK и AVD Manager, чтобы запустить Android SDK и AVD Manager в Eclipse.
  5. Создайте в Android SDK и AVD Manager виртуальное Android-устройство (AVD), которое представляет собой эмулятор Android.

    Для AVD выберите Platform 3.0 и API 11.

Создание XML-документа

В этом разделе мы создадим XML-документ на платформе Android. Первым шагом будет создание нового проекта Android.

  1. В Eclipse IDE выберите File > New. В диалоговом окне New выберите Android > Android Project. Нажмите кнопку Next.
  2. В окне New Android Project, показанном на рисунке 1, укажите:
    • Имя проекта: CreatingXML
    • Флажок Build Target: Android Platform 3.0 и API 11
    • Properties:
      • Application name: CreatingXML
      • Package name: android.xml
      • Выберите Create Activity: класс Activity (CreatingXML). Под действием (activity) имеется в виду взаимодействие с пользователем. При расширении класса Activity создается окно пользовательского интерфейса.
      • Минимальная версия SDK: 11
    Рисунок 1. Создание проекта Android для платформы 3.0
    Создание проекта Android для платформы 3.0
  3. Нажмите кнопку Next.
  4. Нажмите Finish. Полученный Android-проект будем использовать для создания XML-документа. Android-проект состоит из следующих файлов:
    • класс (взаимо)действия CreatingXML, расширяющий класс Activity;
    • файл res/layout/main.xml, который указывает расположение компонентов пользовательского интерфейса Android;
    • файл AndroidManifest.xml, который содержит конфигурацию приложения - имя пакета, основные действия при запуске Android-приложения, компоненты приложения, процессы, разрешения и минимальный уровень API.

На рисунке 2 показана структура каталогов CreatingXML проекта Android.

Рисунок 2. Android-проект для создания XML-документа
Android-проект для создания XML-документа

Файл res/layout/main.xml указывает расположение компонентов пользовательского интерфейса Android. Создайте LinearLayout и присвойте android:orientation значение vertical. В этом примере XML-документ будет отображаться как текстовое сообщение. Добавьте элемент TextView с идентификатором xmlresult для отображения XML-документа, как показано в в листинге 1.

Листинг 1. Файл макета main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical" android:layout_width="fill_parent"
     android:layout_height="fill_parent">
     <TextView android:id="@+id/xmlresult" android:layout_width="fill_parent"
          android:layout_height="wrap_content" />
</LinearLayout>

В файле AndroidManifest.xml укажите Activity, чтобы он запускался как CreatingXML. Укажите минимальную версию Android с помощью элемента uses-sdk 11. Действие, intent-filter и action, определяется элементом и подэлементами действия. Файл показан в листинге 2.

Листинг 2. Файл конфигурации AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="android.xml"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="11" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".CreatingXML"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

Теперь создадим XML-документ в классе действия CreatingXML, расширяющем класс Activity. Так как в примере для создания XML-документа используется javax.xml.parsers.DocumentBuilder, импортируйте следующие классы и пакеты:

  • класс javax.xml.parsers.DocumentBuilder,
  • класс javax.xml.parsers.DocumentBuilderFactory,
  • пакет org.w3c.dom,
  • класс javax.xml.transform.TransformerFactory,
  • класс javax.xml.transform.Transformer,
  • класс javax.xml.transform.dom.DOMSource и
  • класс javax.xml.transform.stream.StreamResult.

В начале действия вызывается метод OnCreate (пакет savedInstanceState). В методе onCreate задайте UI с помощью метода setContentView и установите ресурс макета с помощью setContentView(R.layout.main);.

Определите объект Android-виджета TextView в файле main.xml с помощью метода findViewById с идентификатором xmlresult следующим образом: TextView xmlResult = (TextView) findViewById(R.id.xmlresult); .

Создайте экземпляр объект DocumentBuilderFactory с применением статического метода newInstance(). Создайте объект DocumentBuilder с помощью метода newDocumentBuilder() класса DocumentBuilderFactory, как в листинге 3.

Листинг 3. Создание DocumentBuilder
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

XML-документ представлен структурой DOM. Создайте новый объект Document, используя метод newDocument() класса DocumentBuilder: Document document = documentBuilder.newDocument();.

Создайте корневой элемент catalog объекта Document с помощью метода createElement(): Element rootElement = document.createElement("catalog");.

Как показано в в листинге 4, установите атрибуты publisher и journal корневого элемента с помощью метода setAttribute.

Листинг 4. Задание атрибутов корневого элемента
rootElement.setAttribute("journal", "Oracle Magazine");
rootElement.setAttribute("publisher", "Oracle Publishing");

Добавьте корневой элемент в объект Document с помощью метода appendChild(): document.appendChild(rootElement);.

Создайте элемент article с использованием метода createElement(). Добавьте этот элемент в корневой элемент с помощью метода appendChild(), как в листинге 5.

Листинг 5. Создание элемента article
Element articleElement = document.createElement("article");
rootElement.appendChild(articleElement);

Как показано в листинге 6, добавьте к элементу article элемент edition.

Листинг 6. Добавление элемента edition
Element editionElement = document.createElement("edition");
articleElement.appendChild(editionElement);

Добавьте в элемент edition текстовый узел с использованием метода createTextNode(). Задайте значение текстового узла "Sept-Oct 2005" следующим образом: editionElement.appendChild(document.createTextNode("Sept-Oct 2005"));.

Аналогично создайте и добавьте к элементу article элемент title. Как видно в листинге 7, добавьте текстовый узел в элемент title и установите его значение: Creating Search Pages.

Листинг 7. Создание текстового узла
Element titleElement = document.createElement("title");
articleElement.appendChild(titleElement);
titleElement.appendChild(document.createTextNode("Creating Search Pages"));

Добавьте к элементу article элемент author. Добавьте текстовый узел в элемент author и установите его значение равным Steve Muench, как в листинге 8.

Листинг 8. Добавление элемента author
authorElement = document.createElement("author");
articleElement.appendChild(authorElement);
authorElement.appendChild(document.createTextNode("Steve Muench"));

Добавьте в корневой элемент еще один элемент article. Структуру DOM XML-документа можно создать точно так же, как это делается для не-Android приложений. Например:

  • выведите объект DOM Document в ByteArrayOutputStream;
  • получите XML-документ в виде строки из OutputStream;
  • введите строку в виджет TextView на Android-устройстве.

Создайте объект TransformerFactory с помощью статического метода newInstance(). Как показано в листинге 9, создайте объект Transformer с помощью метода newTransformer() объекта factory.

Листинг 9. Создание объекта transformer
TransformerFactory factory = TransformerFactory.newInstance();			
Transformer transformer = factory.newTransformer();

Создайте объект java.util.Properties и задайте выходные свойства:

  • отступ (INDENT);
  • формат вывода (METHOD);
  • XML-декларацию (OMIT_XML_DECLARATION);
  • версию XML (VERSION);
  • кодировку XML-документа (ENCODING).

Чтобы преобразовать структуру DOM, нам понадобятся объекты Source и Result. Создайте объект DOMSource из объекта Document. Для вывода создайте ByteArrayOutputStream и объект StreamResult из ByteArrayOutputStream, как в листинге 10.

Листинг 10. Преобразование структуры DOM
DOMSource domSource = new DOMSource(document.getDocumentElement());
OutputStream output = new ByteArrayOutputStream();
StreamResult result = new StreamResult(output);

Преобразуйте объект Document с помощью метода transform() объекта Transformer следующим образом: transformer.transform(domSource, result);.

Получите объект String из объекта ByteArrayOutputStream и задайте String в виджете TextViewxmlResult.

Листинг 11. Получение и задание строки
String xmlString = output.toString();
xmlResult.setText(xmlString);

В листинге 12 показан класс ActivityCreatingXML.

Листинг 12. Класс Activity (CreatingXML)
package android.xml;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import java.util.Properties;
import javax.xml.transform.OutputKeys;

import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;

import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.transform.dom.DOMSource;

public class CreatingXML extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView     xmlResult = (TextView) findViewById(R.id.xmlresult);

        try {
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                      .newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory
                      .newDocumentBuilder();
            Document document = documentBuilder.newDocument();

            Element rootElement = document.createElement("catalog");
            rootElement.setAttribute("journal", "Oracle Magazine");
            rootElement.setAttribute("publisher", "Oracle Publishing");
            document.appendChild(rootElement);

            Element articleElement = document.createElement("article");
            rootElement.appendChild(articleElement);

            Element editionElement = document.createElement("edition");
            articleElement.appendChild(editionElement);
            editionElement.
            appendChild(document.createTextNode("Sept-Oct 2005"));

            Element titleElement = document.createElement("title");
            articleElement.appendChild(titleElement);
            titleElement.appendChild(document
                      .createTextNode("Creating Search Pages"));

            Element authorElement = document.createElement("author");
            articleElement.appendChild(authorElement);
            authorElement.
            appendChild(document.createTextNode("Steve Muench"));

            articleElement = document.createElement("article");
            rootElement.appendChild(articleElement);

            editionElement = document.createElement("edition");
            articleElement.appendChild(editionElement);
            editionElement.appendChild(document
                      .createTextNode("November - December 2010"));

            titleElement = document.createElement("title");
            articleElement.appendChild(titleElement);
            titleElement.appendChild(document
                      .createTextNode("Agile Enterprise Architecture"));

            authorElement = document.createElement("author");
            articleElement.appendChild(authorElement);
            authorElement.appendChild(document.createTextNode("Bob Rhubart"));

            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();
            Properties outFormat = new Properties();
            outFormat.setProperty(OutputKeys.INDENT, "yes");
            outFormat.setProperty(OutputKeys.METHOD, "xml");
            outFormat.setProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
            outFormat.setProperty(OutputKeys.VERSION, "1.0");
            outFormat.setProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperties(outFormat);
            DOMSource domSource = 
            new DOMSource(document.getDocumentElement());
            OutputStream output = new ByteArrayOutputStream();
            StreamResult result = new StreamResult(output);
            String xmlString = output.toString();
            xmlResult.setText(xmlString);

        } catch (ParserConfigurationException e) {
        } catch (TransformerConfigurationException e) {
        } catch (TransformerException e) {
        }

    }
}

На этом этапе можно запустить Android-приложение. Щелкните правой кнопкой мыши на узле приложения CreatingXML и выберите Run As > Android Application, как показано на рисунке 3.

Рисунок 3. Запуск Android-приложения
Запуск Android-приложения

Запускается Android AVD, и в AVD развертывается Android-приложение, как показано на рисунке 4.

Рисунок 4. Приложение CreatingXML, установленное на Android-устройстве
Приложение CreatingXML, установленное на Android-устройстве

Нажмите значок CreatingXML этого приложения. Приложение начинает работать и создает XML-документ, который отображается на Android-устройстве, как показано на рисунке 5.

Рисунок 5. Создание и отображение XML-документа на Android-устройстве
Создание и отображение XML-документа на Android-устройстве

Синтаксический анализ XML-документа

В этом разделе объясняется, как выполнить синтаксический анализ XML-документа. Можно использовать стандартные анализаторы DOM и SAX или другой синтаксический анализатор. В примере с использованием org.xmlpull.v1.XmlPullParser мы проанализируем XML-документ catalog.xml, как показано в листинге 13.

Листинг 13. catalog.xml
<?xml version = '1.0' encoding = 'UTF-8'?>
<catalog journal="Oracle Magazine" publisher="Oracle Publishing">
     <article>
          <edition>Sept-Oct 2005</edition>
          <title>Creating Search Pages</title>
          <author>Steve Muench</author>
     </article>
     <article>
          <edition>November - December 2010</edition>
          <title>Agile Enterprise Architecture</title>
          <author>Bob Rhubart</author>
     </article>
</catalog>

Как и в предыдущем разделе Создание XML-документа, для анализа XML-документа необходимо создать Android-проект.

  1. В Eclipse IDE выберите File > New. В диалоговом окне New выберите Android > Android Project. Нажмите кнопку Next.
  2. Как показано на рисунке 6, в окне New Android Project укажите:
    • Имя проекта: ParsingXML
    • Флажок Build Target: Android Platform 3.0 b API 11.
    • Свойства:
      • Имя приложения: ParsingXML
      • Имя пакета: android.xml
      • Выберите Create Activity: класс Activity (ParsingXML)
      • Минимальная версия SDK: 11
    Рисунок 6. Создание Android-проекта синтаксического анализа XML-документа
    Создание Android-проекта синтаксического анализа XML-документа
  3. Нажмите Finish.

    Android-проект создан. Он содержит:

    • класс ActivityParsingXML;
    • файл макета res/layout/main.xml;
    • файл конфигурации приложения AndroidManifest.xml.

Выполните синтаксический анализ XML-документа и используйте метки для вывода значений элементов. Метки и значения текстовых узлов элементов выводятся в виджеты TextView.

  1. В файл main.xml добавьте виджет TextView для каждого значения метки и текстового узла элемента.
  2. Создайте LinearLayout и присвойте элементу android:orientation значение vertical.
  3. Добавьте элементы TextView со следующими идентификаторами:
    • "journal_label"
    • "journal"
    • "publisher_label"
    • "publisher"
    • "edition1_label"
    • "edition1"
    • "title1_label"
    • "title1"
    • "author1_label"
    • "author1"
    • "edition2_label"
    • "title2_label"
    • "title2"
    • "author2_label"
    • "author2"

Файл main.xml показан в листинге 14.

Листинг 14. Файл макета main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical" android:layout_width="fill_parent"
     android:layout_height="fill_parent">
          <TextView android:id="@+id/journal_label"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content"
               android:text="Journal:" />
          <TextView android:id="@+id/journal" android:singleLine="true"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content" />
          <TextView android:id="@+id/publisher_label"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content"
               android:text="Publisher:" />
          <TextView android:id="@+id/publisher"
               android:singleLine="true"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content" />
          <TextView android:id="@+id/edition1_label"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content"
               android:text="Edition:" />
          <TextView android:id="@+id/edition1" android:singleLine="true"
               android:layout_width="fill_parent" 			
               android:layout_height="wrap_content" />
          <TextView android:layout_width="fill_parent" 
               android:id="@+id/title1_label"
               android:layout_height="wrap_content" android:text="Title:" />
          <TextView android:id="@+id/title1" 			
               android:singleLine="true" android:layout_width="fill_parent"
               android:layout_height="wrap_content" />
          <TextView android:layout_width="fill_parent" 
               android:id="@+id/author1_label"
               android:layout_height="wrap_content" android:text="Author:" />

          <TextView android:id="@+id/author1" android:singleLine="true"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content" />
          <TextView android:id="@+id/edition2_label"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content"
               android:text="Edition:" />
          <TextView android:id="@+id/edition2" android:singleLine="true"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content" />
          <TextView android:layout_width="fill_parent" 
               android:id="@+id/title2_label"
               android:layout_height="wrap_content" android:text="Title:" />
          <TextView android:id="@+id/title2" 			
               android:singleLine="true" android:layout_width="fill_parent"
               android:layout_height="wrap_content" />
          <TextView android:layout_width="fill_parent" 
               android:id="@+id/author2_label"
               android:layout_height="wrap_content" android:text="Author:" />
          <TextView android:id="@+id/author2" android:singleLine="true"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content" />
</LinearLayout>

В файле AndroidManifest.xml укажите:

  • activity для запуска как ParsingXML;
  • минимальную версию Android 11 с помощью элемента uses-sdk;
  • activity, intent-filter и action с элементом и подэлементами activity.

Результирующий файл AndroidManifest.xml показан в листинге 15.

Листинг 15. Файл конфигурации AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="android.xml"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="11" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ParsingXML"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

Для анализа ресурса XML-документа в примере используется android.content.res.XmlResourceParser, который расширяет интерфейс XmlPullParser. Для XML-документа нужно создать подкаталог в каталоге res.

  1. Создайте подкаталог xml в каталоге res, затем скопируйте catalog.xml XML-документа в папку res/xml.
  2. В классе действия ParsingXML импортируйте интерфейсы android.content.res.XmlResourceParser и org.xmlpull.v1.XmlPullParser.

    В начале действия вызывается метод OnCreate (Bundle savedInstanceState).

  3. В методе onCreate задайте UI с помощью метода setContentView и ресурс макета: setContentView(R.layout.main);
  4. Получите виджеты Android TextView, определенные в файле main.xml, с помощью метода findViewById и идентификаторов виджетов, как в листинге 16.
Листинг 16. Получение виджетов TextView
TextView journal = (TextView) findViewById(R.id.journal);
TextView publisher = (TextView) findViewById(R.id.publisher);
TextView edition1 = (TextView) findViewById(R.id.edition1);
TextView title1 = (TextView) findViewById(R.id.title1);
TextView author1 = (TextView) findViewById(R.id.author1);
TextView edition2 = (TextView) findViewById(R.id.edition2);
TextView title2 = (TextView) findViewById(R.id.title2);
TextView author2 = (TextView) findViewById(R.id.author2);

Создайте объект XmlResourceParser из документа catalog.xml в каталоге res/xml с помощью следующего кода: XmlResourceParser xpp = getResources().getXml(R.xml.catalog);.

Мы будем анализировать XML-документ с помощью XmlResourceParser, который также является принимающим анализатором (он расширяет интерфейс XmlPullParser). Для принимающего анализатора XML-документ - это просто последовательность событий синтаксического анализа. Получите следующее событие синтаксического анализа с помощью метода next() , как показано ниже: xpp.next();.

Получите тип события с помощью метода getEventTypeint, который возвращает элемент int: eventType = xpp.getEventType();.

Возвращаемый элемент int может принимать одно из значений указанных в таблице 1.

Таблица 1. Значения типов событий int
Значение intОписание
КомментарийXML-комментарий
DOCDECLОбъявление типа XML-документа
END_DOCUMENTКонец документа
END_TAGКонец тега элемента
IGNORABLE_WHITESPACEИгнорируемый пробел
PROCESSING_INSTRUCTIONИнструкция по обработке
START_DOCUMENTНачало документа
START_TAGНачало тега элемента
TEXTСимвольные данные

В XML-документе анализируются только элементы и текстовые узлы элементов. Атрибуты не генерируют событие, и их можно исключить из элемента. Можно искать только типы событий START_TAG и текст, которые соответствуют тегам начала элементов и текстовым узлам элементов. Сначала определитм тег элемента, а затем получим значение текстового узла для тега элемента. Используйте переменную iter типа int для обозначения различных элементов article в XML-документе и переменную elemtext типа String для указания имени тега элемента. Чтобы задать переменную типа int для итератора и переменную типа String для имени элемента, используйте код, приведенный в в листинге 17.

Листинг 17. Задание переменных
int iter = 0;
String elemtext = null;

Прежде чем будет достигнут конец XML-документа:

  • определите типы событий;
  • получите имена и текстовые значения тегов элементов;
  • задайте значения текстовых узлов в соответствующих виджетах TextView.

Например, в листинге 18 показано, как получить имя тега элемента.

Листинг 18. Получение имен элементов для тегов начала
while (eventType != XmlPullParser.END_DOCUMENT) {
              if (eventType == XmlPullParser.START_TAG) {
         String elemName = xpp.getName();
...
...
                                                         }
                                                 }

Если имя тега элемента catalog, получите значения атрибутов для journal и publisher и задайте значения атрибутов в виджетах TextView journal и publisher. Используя метод getAttributeValue() объекта XmlResourceParser, получите значения атрибутов, как показано в листинге 19.

Листинг 19. Получение и задание значений атрибутов
if (elemName.equals("catalog")) {			
String journalAttr = xpp.getAttributeValue(null,"journal");
String publisherAttr = xpp.getAttributeValue(null,"publisher");
journal.setText(journalAttr);				
publisher.setText(publisherAttr);	
...
}

Увеличьте значение переменной итератора iter для каждого элемента article, как показано в в листинге 20.

Листинг 20. Приращение переменной
if (elemName.equals("article")) {
     iter = iter + 1;
                                 }

Получите значения текстовых узлов, если тип события - TEXT, и установите значения текстовых узлов в соответствующих виджетах TextView. Используя переменную elemtext типа String, заданную для типа событий START_TAG, получите имя тега элемента. Используя метод getText() объекта XmlResourceParser, получите значение текстового узла. Установите значения текстовых узлов в виджетах TextView с помощью метода setText, как показано в листинге 21.

Листинг 21. Получение значений текстовых узлов
else if (eventType == XmlPullParser.TEXT) {
//Получение имени и значений текстовых узлов элемента и установка значений текстовых 
//узлов в соответствующих виджетах TextView
}

В листинге 22 показан класс ActivityParsingXML.

Листинг 22. Класс Activity ParsingXML
package android.xml;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import android.content.res.XmlResourceParser;

public class ParsingXML extends Activity {
    /** Вызывается при первоначальном создании действия */
    @Override
    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         //setContentView(R.layout.main);
         setContentView(R.layout.relativelayout);
         TextView journal = (TextView) findViewById(R.id.journal);
         TextView publisher = (TextView) findViewById(R.id.publisher);
         TextView edition1 = (TextView) findViewById(R.id.edition1);
         TextView title1 = (TextView) findViewById(R.id.title1);
         TextView author1 = (TextView) findViewById(R.id.author1);

         TextView edition2 = (TextView) findViewById(R.id.edition2);
         TextView title2 = (TextView) findViewById(R.id.title2);
         TextView author2 = (TextView) findViewById(R.id.author2);
         try {
              XmlResourceParser xpp = getResources().getXml(R.xml.catalog);

              xpp.next();
              int eventType = xpp.getEventType();
              int iter = 0;
              String elemtext = null;

              while (eventType != XmlPullParser.END_DOCUMENT) {

                 if (eventType == XmlPullParser.START_TAG) {

                     String elemName = xpp.getName();
                     if (elemName.equals("catalog")) {
                 String journalAttr = xpp.getAttributeValue(null,
                                  "journal");
                 String publisherAttr = xpp.getAttributeValue(null,
                                  "publisher");
                        journal.setText(journalAttr);
                        publisher.setText(publisherAttr);
                     }
                     if (elemName.equals("article")) {
                        iter = iter + 1;
                     }

                     if (elemName.equals("edition")) {
                        elemtext = "edition";
                     }
                     if (elemName.equals("title")) {
                        elemtext = "title";
                     }
                     if (elemName.equals("author")) {
                        elemtext = "author";
                     }
                 }

                 else if (eventType == XmlPullParser.TEXT) {
                     if (iter == 1) {
                        if (elemtext.equals("edition")) {
                             edition1.setText(xpp.getText());
                        } else if (elemtext.equals("title")) {
                             title1.setText(xpp.getText());
                        } else if (elemtext.equals("author")) {
                             author1.setText(xpp.getText());
                        }
                     }

                     else if (iter == 2) {
                        if (elemtext.equals("edition")) {
                             edition2.setText(xpp.getText());
                        } else if (elemtext.equals("title")) {
                             title2.setText(xpp.getText());
                        } else if (elemtext.equals("author")) {
                             author2.setText(xpp.getText());
                        }

                     }
                 }
                 eventType = xpp.next();
              }

         } catch (XmlPullParserException e) {
         } catch (IOException e) {
         }

    }
}

Чтобы запустить Android-приложение, щелкните правой кнопкой мыши на узле ParsingXML и выберите Run As > Android Application, как показано на рисунке 7.

Рисунок 7. Запуск Android-приложения для анализа XML-документа
Запуск Android-приложения для анализа XML-документа

Запускается Android AVD, и приложение ParsingXML устанавливается на Android-устройство, как показано на рисунке 8.

Рисунок 8. ParsingXML-приложение, установленное на Android-устройстве
ParsingXML-приложение, установленное на Android-устройстве

Щелкните на приложении ParsingXML, чтобы оно начало действовать. XML-документ catalog.xml анализируется и выводится на Android-устройство, как показано на рисунке 9.

Рисунок 9. Значения узлов XML-документа, полученные в результате синтаксического анализа
Значения узлов XML-документа, полученные в результате синтаксического анализа

Метки и текстовые узлы элемента располагаются по вертикали. Предпочтительнее макет, в котором значения текстовых узлов находятся справа от соответствующих меток. Для получения специального макета со значениями текстовых узлов справа от метки используйте RelativeLayout вместо LinearLayout. Для значений текстовых узлов, которые появляются справа от метки, используйте атрибут android:layout_marginLeft виджета TextView. Чтобы значения текстовых узлов отображались под значениями текстовых узлов предыдущей строки, используйте атрибут android:layout_below.

RelativeLayout предоставляет и другие атрибуты, такие как android:layout_toRightOf для вывода виджета справа от другого виджета и андроид:layout_toLeftOf для вывода компонента слева от другого компонента. В листинге 23 приведен файл main.xml для управления относительным расположением элементов.

Листинг 23. Управление относительным расположением элементов
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:padding="5px">

          <TextView android:id="@+id/journal_label"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content"
               android:text="Journal:" />

          <TextView android:id="@+id/journal"  
               android:layout_marginLeft="50px"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content" />

          <TextView android:id="@+id/publisher_label" 
               android:layout_below="@id/journal_label"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content"
               android:text="Publisher:" />

          <TextView android:id="@+id/publisher"
               android:layout_below="@id/journal"
               android:layout_marginLeft="70px"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content" />

          <TextView android:id="@+id/edition1_label"  
               android:layout_below="@id/publisher_label"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content"
               android:text="Edition:" />

          <TextView android:id="@+id/edition1" 
               android:layout_below="@id/publisher"
               android:layout_width="fill_parent" 
               android:layout_marginLeft="50px"
               android:layout_height="wrap_content" />

          <TextView android:layout_width="fill_parent" 
               android:id="@+id/title1_label" 
               android:layout_below="@id/edition1_label"
               android:layout_height="wrap_content" 
               android:text="Title:" />

          <TextView android:id="@+id/title1" 
               android:layout_marginLeft="40px" 
               android:layout_below="@id/edition1"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content" />

          <TextView android:layout_width="fill_parent" 
               android:id="@+id/author1_label" 
               android:layout_below="@id/title1_label"
               android:layout_height="wrap_content" 
               android:text="Author:" />

          <TextView android:id="@+id/author1" 
               android:layout_below="@id/title1"
               android:layout_width="fill_parent" 
               android:layout_marginLeft="50px"
               android:layout_height="wrap_content" />

          <TextView android:id="@+id/edition2_label" 
               android:layout_below="@id/author1_label"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content"
               android:text="Edition:" />

          <TextView android:id="@+id/edition2" 
               android:layout_below="@id/author1"
               android:layout_width="fill_parent" 
               android:layout_marginLeft="50px"
               android:layout_height="wrap_content" />

          <TextView android:layout_width="fill_parent" 
               android:id="@id/title2_label" 
               android:layout_below="@id/edition2_label"
               android:layout_height="wrap_content" 
               android:text="Title:" />

          <TextView android:id="@+id/title2" 
               android:layout_marginLeft="40px" 
               android:layout_below="@id/edition2"
               android:layout_width="fill_parent" 
               android:layout_height="wrap_content" />

          <TextView android:layout_width="fill_parent" 
               android:id="@+id/author2_label" 
               android:layout_below="@id/title2_label"
               android:layout_height="wrap_content" 
               android:text="Author:" />

          <TextView android:id="@+id/author2" 
               android:layout_below="@id/title2"
               android:layout_width="fill_parent" 
               android:layout_marginLeft="50px"
               android:layout_height="wrap_content" />

</RelativeLayout>

После изменения макета перезапустите приложение ParsingXML. XML-документ анализируется, и значения узлов выводятся в указанном месте, как показано на рисунке 10.

Рисунок 10. Отформатированные значения узлов XML документа
Отформатированные значения узлов XML документа

Заключение

Вы научились создавать и анализировать XML-документы на платформе Android 3.0, которая используется для смартфонов и планшетов. В примерах к этой статье для создания XML-документа применяются стандартные API Android DocumentBuilder и Transformer. Вы научились также применять для синтаксического анализа XML-документов класс XMLResourceParser, расширяющий класс XmlPullParser.


Загрузка

ОписаниеИмяРазмер
Android-XML-Eclipse-приложение android-xml-sourcecode.zip149 KB

Ресурсы

Научиться

Получить продукты и технологии

  • Android SDK: последние инструменты или платформы.
  • Android Development Tools (ADT): плагин, предоставляющий мощную интегрированную среду для создания Android-приложений.
  • JDK 6.0: последние выпуски Java™, в том числе с повышенной производительностью и исправленными ошибками.
  • Eclipse для Java EE: последняя версия.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, Open source
ArticleID=823878
ArticleTitle=Создание и анализ XML-документов на платформе Android 3.0
publish-date=07022012