Tạo và phân tích cú pháp XML trên nền tảng Android 3.0

Sử dụng cùng các API của trình xây dựng, trình phân tích cú pháp và trình chuyển đổi cho XML và Android

Android, nền tảng điện thoại thông minh được dùng phổ biến nhất, cũng chạy trên các máy tính bảng di động. XML là phương tiện trao đổi dữ liệu tiêu chuẩn. Bạn có thể sử dụng cùng các API trình xây dựng, trình phân tích cú pháp và trình chuyển đổi để phân tích cú pháp và chuyển đổi XML tiêu chuẩn và cho Android. Với javax.xml.parsers.DocumentBuilder, bạn có thể tạo ra một đối tượng org.w3c.dom.Document. Trong bài này, hãy tạo và phân tích cú pháp một tài liệu XML trên một thiết bị Android bằng cách sử dụng một đối tượng DocumentBuilder (Trình xây dựng tài liệu) nhận được từ một DocumentBuilderFactory (Nhà máy của Trình xây dựng tài liệu). Bạn sẽ phân tích cú pháp tài liệu XML bằng cách sử dụng một phần mở rộng của một trình phân tích cú pháp kéo XML.

Deepak Vohra, Nhà tư vấn, Greater Detroit

Deepak Vohra là một nhà lập trình Java có chứng chỉ Sun và nhà phát triển Thành phần Web có chứng chỉ Sun. Deepak đã công bố trong tạp chí Nhà phát triển Java và Tạp chí XML.



26 04 2012

Giới thiệu

Android, nền tảng điện thoại thông minh được dùng phổ biến nhất, hoạt động trên cả các máy điện thoại thông minh lẫn các máy tính bảng di động. XOOM của Motorola là một Máy tính bảng Android. Trong bài này, hãy tìm hiểu cách tạo và phân tích cú pháp một tài liệu XML trên một thiết bị Android. Để xuất ra XML, bạn có thể sử dụng lớp javax.xml.transform.Transformer tiêu chuẩn. Để phân tích cú pháp XML trên Android, bạn có thể sử dụng các trình trình phân tích cú pháp DOM và SAX. Trình phân tích cú pháp kéo org.xmlpull.v1.XmlPullParser cũng là một tùy chọn để phân tích cú pháp XML. Các ví dụ trong bài này sử dụng Nền tảng Android 3.0 để xử lý XML.

Hãy tải về ứng dụng ví dụ được dùng trong bài này.


Thiết lập môi trường

Để cùng làm theo với các ví dụ trong bài này, hãy cài đặt và cấu hình phần mềm sau đây. Xem Tài nguyên để có các liên kết.

Các từ viết tắt thông dụng

  • ADT: Các công cụ phát triển Android
  • API: Giao diện lập trình ứng dụng
  • AVD: Thiết bị ảo Android
  • DOM: Mô hình đối tượng tài liệu
  • IDE: Môi trường phát triển tích hợp
  • JSON: Ký pháp đối tượng JavaScript
  • SAX: API đơn giản cho XML
  • SDK: Bộ công cụ cho nhà phát triển phần mềm
  • UI: Giao diện người dùng
  • XML: Ngôn ngữ đánh dấu mở rộng
  1. Cài đặt Eclipse IDE.
  2. Cài đặt trình cắm thêm ADT cho Eclipse, nó cung cấp một bộ các phần mở rộng để phát triển các ứng dụng Android trong Eclipse.
  3. Tải về và cài đặt Android SDK Platform (Nền tảng SDK của Android), cung cấp các công cụ để phát triển các ứng dụng Android.
  4. Chọn Window > Android SDKAVD Manager, để khởi chạy Android SDK và AVD Manager (Trình quản lý AVD) trong Eclipse.
  5. Tạo một AVD (Thiết bị ảo Android), một bộ mô phỏng cho Android, trong Android SDK và AVD Manager.

    Chọn Platform 3.0API 11 cho AVD.

Tạo một tài liệu XML

Trong phần này, bạn tạo một tài liệu XML trên Android. Bước đầu tiên là tạo một dự án Android.

  1. Trong Eclipse IDE, chọn File > New. Trong hộp thoại New, chọn Android > Android Project. Nhấn Next.
  2. Trong cửa sổ New Android Project (Dự án Android mới), như trong Hình 1, chỉ rõ:
    • Tên dự án: CreatingXML.
    • Đánh dấu chọn hộp kiểm Build Target: Android Platform 3.0 và API 11.
    • Các đặc tính:
      • Tên ứng dụng: CreatingXML.
      • Tên gói: android.xml.
      • Chọn Create Activity (Tạo Hoạt động): Lớp Activity (CreatingXML). Một hoạt động biểu diễn một tương tác người dùng. Lớp này mở rộng lớp Activity và tạo ra một cửa sổ cho một giao diện người dùng.
      • Phiên bản SDK tối thiểu: 11.
    Hình 1. Tạo một dự án Android cho nền tảng 3.0
    Ảnh chụp màn hình về cách tạo một dự án Android dùng cho nền tảng 3.0
  3. Nhấn Next.
  4. Nhấn Finish. (Kết thúc). Một dự án Android mà bạn sẽ sử dụng để tạo một tài liệu XML được tạo ra. Dự án Android gồm có các tệp sau:
    • Một lớp hoạt động, đó là CreatingXML, mở rộng lớp Activity.
    • Tệp res/layout/main.xml, xác định cách bố trí các thành phần giao diện người dùng Android.
    • Tệp AndroidManifest.xml, chứa cấu hình ứng dụng như tên gói, hoạt động chính để khởi chạy khi ứng dụng Android được khởi động, các thành phần ứng dụng, các tiến trình, các quyền hạn và mức API tối thiểu.

Hình 2 cho thấy cấu trúc thư mục của dự án Android CreatingXML.

Hình 2. Dự án Android để tạo một tài liệu XML
Ảnh chụp màn hình về một dự án Android để tạo một XML Document

Trong tệp res/layout/main.xml, hãy chỉ rõ cách bố trí các thành phần giao diện người dùng Android. Hãy tạo ra một LinearLayout và thiết lập android:orientationvertical. Trong ví dụ này, bạn sẽ hiển thị tài liệu XML như là một thông báo văn bản. Thêm một phần tử TextView có id là xmlresult để hiển thị tài liệu XML, như trong Liệt kê 1.

Liệt kê 1. Tệp bố trí, 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>

Trong tệp AndroidManifest.xml, chỉ rõ Activity để khởi chạy là CreatingXML. Chỉ rõ phiên bản Android tối thiểu với phần tử uses-sdk là 11. Hoạt động, intent-filteraction được quy định cụ thể với phần tử hoạt động và các phần tử con. Liệt kê 2 hiển thị tệp này.

Liệt kê 2. Tệp cấu hình, 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>

Bây giờ bạn sẽ tạo ra một tài liệu XML trong lớp hoạt động CreatingXML, lớp này mở rộng lớp Activity. Do ví dụ này sử dụng javax.xml.parsers.DocumentBuilder để tạo ra một tài liệu XML, hãy nhập khẩu các thứ sau đây.

  • Lớp javax.xml.parsers.DocumentBuilder
  • Lớp javax.xml.parsers.DocumentBuilderFactory
  • Gói org.w3c.dom
  • Lớp javax.xml.transform.TransformerFactory
  • Lớp javax.xml.transform.Transformer
  • Lớp javax.xml.transform.dom.DOMSource
  • Lớp javax.xml.transform.stream.StreamResult

Phương thức onCreate(Bundle savedInstanceState) được gọi khi hoạt động khởi động. Trong phương thức onCreate, hãy thiết lập giao diện người dùng bằng cách sử dụng phương thức setContentView và thiết lập tài nguyên bố trí bằng cách sử dụng setContentView(R.layout.main);.

Xác định đối tượng TextView của widget (tiện ích) Android trong tệp main.xml bằng cách sử dụng phương thức findViewById, với id là xmlresult, như sau: TextView xmlResult = (TextView) findViewById(R.id.xmlresult); .

Tạo một cá thể của đối tượng DocumentBuilderFactory bằng cách sử dụng phương thức tĩnh newInstance(). Tạo một đối tượng DocumentBuilder bằng cách sử dụng phương thức newDocumentBuilder() của lớp DocumentBuilderFactory, như trong Liệt kê 3.

Liệt kê 3. Tạo một DocumentBuilder
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

Một tài liệu XML được biểu diễn bằng một cấu trúc DOM. Tạo một đối tượng Document mới, sử dụng phương thức newDocument() của lớp DocumentBuilder, với: Document document = documentBuilder.newDocument();.

Tạo ra phần tử gốc "catalog" (danh mục) của đối tượng Document bằng cách sử dụng phương thức createElement(): Element rootElement = document.createElement("catalog");.

Như trong Liệt kê 4, thiết lập các thuộc tính publisherjournal trên phần tử gốc bằng cách sử dụng phương thức setAttribute.

Liệt kê 4. Thiết lập các thuộc tính phần tử gốc
rootElement.setAttribute("journal", "Oracle Magazine");
rootElement.setAttribute("publisher", "Oracle Publishing");

Thêm phần tử gốc vào đối tượng Document bằng cách sử dụng phương thức appendChild(): document.appendChild(rootElement);.

Tạo một phần tử "article" (bài viết) bằng cách sử dụng phương thức createElement(). Gắn phần tử này vào phần tử gốc bằng cách sử dụng phương thức appendChild(), như trong Liệt kê 5.

Liệt kê 5. Tạo ra một phần tử "article"
Element articleElement = document.createElement("article");
rootElement.appendChild(articleElement);

Như trong Liệt kê 6, thêm một phần tử "edition" (ấn bản) vào phần tử "article".

Liệt kê 6. Thêm phần tử "edition"
Element editionElement = document.createElement("edition");
articleElement.appendChild(editionElement);

Thêm một nút văn bản vào phần tử "edition" bằng cách sử dụng phương thức createTextNode(). Thiết lập giá trị nút văn bản "Sept-Oct 2005" (Tháng Chín-Tháng Mười năm 2005) như sau: editionElement.appendChild(document.createTextNode("Sept-Oct 2005"));.

Tương tự, tạo và thêm một phần tử "title" (tên bài) vào phần tử "article". Như trong Liệt kê 7, hãy thêm một nút văn bản vào phần tử "title" và thiết lập giá trị của nó là "Creating Search Pages" (Tạo các trang tìm kiếm).

Liệt kê 7. Tạo một nút văn bản
Element titleElement = document.createElement("title");
articleElement.appendChild(titleElement);
titleElement.appendChild(document.createTextNode("Creating Search Pages"));

Thêm một phần tử "author" (tác giả) vào phần tử "article". Thêm một nút văn bản vào phần tử "author" và thiết lập giá trị của nó là "Steve Muench", như trong Liệt kê 8.

Liệt kê 8. Thêm phần tử "author"
authorElement = document.createElement("author");
articleElement.appendChild(authorElement);
authorElement.appendChild(document.createTextNode("Steve Muench"));

Thêm một phần tử "article" khác vào phần tử gốc. Bạn có thể tạo ra một cấu trúc DOM của tài liệu XML giống như cách bạn làm cho một ứng dụng không phải Android. Ví dụ là:

  • Xuất ra đối tượng Document DOM vào một ByteArrayOutputStream.
  • Thu được tài liệu XML như là một chuỗi ký tự từ OutputStream.
  • Thiết lập chuỗi ký tự trên widget TextView trên Android.

Tạo một đối tượng TransformerFactory bằng cách sử dụng phương thức tĩnh newInstance(). Như trong Liệt kê 9, , hãy tạo một đối tượng Transformer (trình chuyển đổi) bằng cách sử dụng phương thức newTransformer() của đối tượng factory.

Liệt kê 9. Tạo một đối tượng
TransformerFactory factory = TransformerFactory.newInstance();			
Transformer transformer = factory.newTransformer();

Tạo một đối tượng java.util.Properties và thiết lập các đặc tính đầu ra cho:

  • Thụt lề (INDENT).
  • Định dạng xuất ra (METHOD).
  • Khai báo XML (OMIT_XML_DECLARATION).
  • Phiên bản XML (VERSION).
  • Bộ mã ký tự (ENCODING) của tài liệu XML.

Để chuyển đổi cấu trúc DOM, bạn cần một đối tượng Source (Nguồn) và một đối tượng Result (Kết quả). Tạo một đối tượng DOMSource từ đối tượng Document. Để xuất ra, hãy tạo một đối tượng ByteArrayOutputStream và một đối tượng StreamResult từ ByteArrayOutputStream, như trong Liệt kê 10.

Liệt kê 10. Chuyển đổi cấu trúc DOM
DOMSource domSource = new DOMSource(document.getDocumentElement());
OutputStream output = new ByteArrayOutputStream();
StreamResult result = new StreamResult(output);

Chuyển đổi đối tượng Document bằng cách sử dụng phương thức transform() của đối tượng Transformer, như sau: transformer.transform(domSource, result);.

Lấy đối tượng String từ đối tượng ByteArrayOutputStream và thiết lập String trên widget TextViewxmlResult.

Liệt kê 11. Lấy và thiết lập String
String xmlString = output.toString();
xmlResult.setText(xmlString);

Liệt kê 12 cho thấy lớp ActivityCreatingXML.

Liệt kê 12. Lớp 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) {
        }

    }
}

Tại thời điểm này, bạn có thể chạy ứng dụng Android. Nhấn chuột phải vào nút ứng dụng CreatingXML và chọn Run As > Android Application, như trong Hình 3.

Hình 3. Chạy ứng dụng Android
Ảnh chụp màn hình về cách chạy ứng dụng Android

Android AVD khởi động và ứng dụng Android triển khai trên AVD, như trong Hình 4.

Hình 4. Ứng dụng CreatingXML đã cài đặt trên thiết bị Android
Ảnh chụp màn hình về ứng dụng CreatingXML được cài đặt trên thiết bị Android

Nhấn vào biểu tượng ứng dụng CreatingXML. Hoạt động của ứng dụng khởi động và tài liệu XML được tạo ra và được hiển thị trên thiết bị Android, như trong Hình 5.

Hình 5. Tạo và hiển thị một tài liệu XML trên thiết bị Android
Ảnh chụp màn hình về tạo và hiển thị một tài liệu XML trên thiết bị Android

Phân tích cú pháp một tài liệu XML

Phần này giải thích cách phân tích cú pháp một tài liệu XML. Bạn có thể sử dụng các trình phân tích cú pháp DOM và SAX tiêu chuẩn hoặc trình phân tích cú pháp khác. Trong ví dụ này, sử dụng org.xmlpull.v1.XmlPullParser, bạn sẽ phân tích tài liệu XML catalog.xml như trong Liệt kê 13.

Liệt kê 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>

Như trong phần Tạo một tài liệu XML ở bên trên, bạn cần tạo ra một dự án Android để phân tích cú pháp tài liệu XML.

  1. Trong Eclipse IDE, chọn File > New. Trong hộp thoại New, chọn Android > Android Project. Nhấn Next.
  2. Trong cửa sổ New Android Project (Dự án Android mới), như trong Hình 6, chỉ rõ:
    • Tên dự án: ParsingXML.
    • Đánh dấu chọn hộp kiểm Build Target (Đích xây dựng): Android Platform 3.0 và API 11.
    • Các đặc tính:
      • Tên ứng dụng: ParsingXML.
      • Tên gói: android.xml.
      • Chọn Create Activity (Tạo Hoạt động): Lớp Activity (ParsingXML).
      • Phiên bản SDK tối thiểu: 11.
    Hình 6. Tạo một dự án Android để phân tích cú pháp một tài liệu XML
    Ảnh chụp màn hình về cách tạo một dự án Android để phân tích cú pháp một tài liệu XML
  3. Nhấn Finish.

    Một dự án Android được tạo ra. Nó gồm có:

    • Một lớp ActivityParsingXML.
    • Một tệp res/layout/main.xml để bố trí.
    • Một tệp AndroidManifest.xml để cấu hình ứng dụng.

Phân tích tài liệu XML và sử dụng các nhãn để xuất ra các giá trị phần tử. Các nhãn và các giá trị nút văn bản của phần tử được xuất ra các widget TextView.

  1. Trong tệp main.xml, thêm một widget TextView cho từng nhãn và giá trị nút văn bản phần tử.
  2. Tạo một LinearLayout và thiết lập android:orientation"vertical".
  3. Thêm các phần tử TextView với các id sau đây:
    • "journal_label"
    • "journal"
    • "publisher_label"
    • "publisher"
    • "edition1_label"
    • "edition1"
    • "title1_label"
    • "title1"
    • "author1_label"
    • "author1"
    • "edition2_label"
    • "title2_label"
    • "title2"
    • "author2_label"
    • "author2"

Liệt kê 14 hiển thị tệp main.xml.

Liệt kê 14. Tệp bố trí, 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>

Trong tệp AndroidManifest.xml, chỉ rõ:

  • Activity để khởi chạy là ParsingXML.
  • Phiên bản Android tối thiểu là 11 với phần tử uses-sdk.
  • Activity, intent-filteraction với phần tử hoạt động và các phần tử con.

Liệt kê 15 hiển thị tệp kết quả AndroidManifest.xml:

Liệt kê 15. Tệp cấu hình, 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>

Để phân tích cú pháp tài nguyên tài liệu XML, ví dụ này sử dụng android.content.res.XmlResourceParser, nó mở rộng giao diện XmlPullParser. Bạn cần tạo ra một thư mục trong thư mục res cho tài liệu XML.

  1. Tạo một thư mục gọi là xml trong thư mục res, sau đó sao chép tài liệu XML catalog.xml vào thư mục res/xml.
  2. Trong lớp hoạt động ParsingXML, hãy nhập khẩu các giao diện android.content.res.XmlResourceParser và org.xmlpull.v1.XmlPullParser.

    Phương thức onCreate(Bundle savedInstanceState) được gọi khi hoạt động này được khởi động.

  3. Trong phương thức onCreate, thiết lập giao diện người dùng bằng cách sử dụng phương thức setContentView và tài nguyên bố trí, như sau: setContentView(R.layout.main);
  4. Lấy các widget TextView của Android được định nghĩa trong tệp main.xml bằng cách sử dụng phương thức findViewById và các id của widget, như trong Liệt kê 16.
Liệt kê 16. Lấy các widget 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);

Tạo một đối tượng XmlResourceParser từ tài liệu catalog.xml trong thư mục res/xml với mã lệnh sau: XmlResourceParser xpp = getResources().getXml(R.xml.catalog);.

Bạn sẽ phân tích cú pháp tài liệu XML bằng cách sử dụng XmlResourceParser, cũng là một trình phân tích cú pháp kéo (nó mở rộng giao diện XmlPullParser). Với trình phân tích cú pháp kéo, một tài liệu XML chỉ là một dãy các sự kiện phân tích cú pháp. Hãy lấy sự kiện phân tích cú pháp tiếp theo bằng cách sử dụng phương thức next() (tiếp theo), như sau: xpp.next();.

Hãy lấy kiểu sự kiện là int bằng cách sử dụng phương thức getEventType, trả về một int: eventType = xpp.getEventType();.

Int được trả về có thể nhận một trong các giá trị trong Table 1.

Bảng 1. Các giá trị kiểu sự kiện int
Giá trị int Mô tả
COMMENTMột chú thích XML
DOCDECLKhai báo kiểu tài liệu XML
END_DOCUMENTKết thúc tài liệu
END_TAGKết thúc một thẻ phần tử
IGNORABLE_WHITESPACEKhoảng trống có thể bỏ qua
PROCESSING_INSTRUCTIONLệnh xử lý
START_DOCUMENTKhởi động một tài liệu
START_TAGBắt đầu một thẻ phần tử
TEXTDữ liệu ký tự

Tài liệu XML chỉ có các phần tử và các nút văn bản phần tử để phân tích cú pháp. Các thuộc tính không tạo ra một sự kiện và bạn có thể lấy chúng ra từ một phần tử. Bạn sẽ chỉ tìm thấy các kiểu sự kiện START_TAGTEXT tương ứng với các thẻ bắt đầu phần tử và các nút văn bản của phần tử. Đầu tiên, hãy xác định thẻ phần tử rồi lấy giá trị nút văn bản cho thẻ phần tử đó. Sử dụng biến kiểu intiter để chỉ ra các phần tử "article" khác nhau trong tài liệu XML và biến kiểu Stringelemtext để chỉ rõ tên thẻ phần tử. Để chỉ rõ một biến kiểu int cho một trình lặp lại (iterator) và một biến kiểu String cho tên phần tử, hãy sử dụng đoạn mã trong Liệt kê 17.

Liệt kê 17. Chỉ rõ các biến
int iter = 0;
String elemtext = null;

Trước khi kết thúc tài liệu XML cần hoàn thành:

  • Xác định các kiểu sự kiện.
  • Lấy các tên thẻ phần tử và các giá trị văn bản thẻ.
  • Thiết lập các giá trị nút văn bản trên các widget TextView tương ứng.

Ví dụ, lấy tên thẻ phần tử như trong Liệt kê 18.

Liệt kê 18. Lấy các tên thẻ phần tử cho các thẻ bắt đầu
while (eventType != XmlPullParser.END_DOCUMENT) {
              if (eventType == XmlPullParser.START_TAG) {
         String elemName = xpp.getName();
...
...
                                                         }
                                                 }

Nếu tên thẻ phần tử là "catalog", hãy lấy các giá trị của các thuộc tính "journal""publisher" " và thiết lập các giá trị thuộc tính trên các widget TextView "journal""publisher". Sử dụng phương thức getAttributeValue() của XmlResourceParser để nhận được các giá trị thuộc tính, như trong Liệt kê 19.

Liệt kê 19. Lấy và thiết lập các giá trị thuộc tính
if (elemName.equals("catalog")) {			
String journalAttr = xpp.getAttributeValue(null,"journal");
String publisherAttr = xpp.getAttributeValue(null,"publisher");
journal.setText(journalAttr);				
publisher.setText(publisherAttr);	
...
}

Tăng thêm biến trình lặp iter cho mỗi phần tử "article", như trong Liệt kê 20.

Liệt kê 20. Tăng thêm biến
if (elemName.equals("article")) {
     iter = iter + 1;
                                 }

Lấy các giá trị nút văn bản nếu kiểu sự kiện là TEXT và thiết lập các giá trị nút văn bản trên các widget TextView tương ứng. Sử dụng biến elemtext kiểu String, đã được thiết lập cho kiểu sự kiện START_TAG, để lấy tên thẻ phần tử. Sử dụng phương thức getText() của XmlResourceParser để lấy giá trị nút văn bản. Thiết lập các giá trị nút văn bản trên các widget TextView bằng cách sử dụng phương thức setText, như trong Liệt kê 21.

Liệt kê 21. Lấy các giá trị nút văn bản
else if (eventType == XmlPullParser.TEXT) {
//Obtain the element name and element text node values and 
//set the text node values on the corresponding TextView 
//widgets
}

Liệt kê 22 hiển thị lớp ActivityParsingXML.

Liệt kê 22. Lớp 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 {
    /** Called when the activity is first created. */
    @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) {
         }

    }
}

Để chạy ứng dụng Android, nhấn phải chuột vào ứng dụng ParsingXML và chọn Run As > Android Application, như trong Hình 7.

Hình 7. Chạy một ứng dụng Android để phân tích cú pháp một tài liệu XML
Ảnh chụp màn hình về chạy ứng dụng Android để phân tích cú pháp một tài liệu XML

Android AVD khởi động và ứng dụng ParsingXML cài đặt trên thiết bị Android, như trong Hình 8.

Hình 8. Ứng dụng ParsingXML đã cài đặt trên một thiết bị Android
Ảnh chụp màn hình về ứng dụng ParsingXML được cài đặt trên thiết bị Android

Nhấn chuột vào ứng dụng ParsingXML để khởi động hoạt động của ứng dụng. Tài liệu XML catalog.xml được phân tích cú pháp và xuất ra tới thiết bị Android, như trong Hình 9.

Hình 9. Các giá trị nút tài liệu XML thu được bằng cách phân tích cú pháp
Ảnh chụp màn hình về các giá trị nút Tài liệu XML thu được từ việc phân tích cú pháp

Các nhãn phần tử và các nút văn bản của phần tử được xếp chồng theo chiều dọc. Cách bố trí trong đó các giá trị nút văn bản nằm bên phải của các nhãn tương ứng có lẽ tốt hơn. Để bố trí tuỳ chỉnh các giá trị nút văn bản ở bên phải của các nhãn, hãy sử dụng RelativeLayout thay cho LinearLayout. Sử dụng thuộc tính android:layout_marginLeft của widget TextView để làm cho các giá trị nút văn bản xuất hiện ở bên phải của các nhãn. Sử dụng thuộc tính android:layout_below để làm cho các giá trị nút văn bản xuất hiện bên dưới các giá trị nút văn bản ở hàng bên trên.

RelativeLayout (bố trí tương đối) cung cấp các thuộc tính khác, như android:layout_toRightOf, để xuất ra một widget ở bên phải của một widget khác và android:layout_toLeftOf để xuất ra một thành phần ở bên trái của thành phần khác. Liệt kê 23 hiển thị main.xml dành cho một bố trí tương đối.

Liệt kê 23. Bố trí tương đối
<?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>

Chạy lại ứng dụng ParsingXML sau khi bạn thay đổi bố trí. Tài liệu XML phân tích cú pháp và xuất ra các giá trị nút theo bố trí đã quy định, như trong Hình 10.

Hình 10. Các giá trị nút tài liệu XML đã định dạng
Ảnh chụp màn hình về các giá trị nút của Tài liệu XML có định dạng

Tóm tắt

Bạn có thể tạo và phân tích cú pháp một tài liệu XML trên nền tảng Android 3.0, được sử dụng cho cả các điện thoại thông minh và các máy tính bảng di động. Trong các ví dụ của bài này, bạn đã sử dụng các API tiêu chuẩn DocumentBuilderTransformer trên Android để tạo ra một tài liệu XML. Bạn đã học được cách sử dụng XMLResourceParser, nó mở rộng XmlPullParser, để phân tích cú pháp một tài liệu XML.


Tải về

Mô tảTênKích thước
Android XML Eclipse applicationandroid-xml-sourcecode.zip149KB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=811908
ArticleTitle=Tạo và phân tích cú pháp XML trên nền tảng Android 3.0
publish-date=04262012