如何在 Android 中使用 SAX 解析器解析 XML?
简介
Android 是一个基于 Linux 内核的开源操作系统,由 Google 开发。在 Android 应用中,我们可以使用多种方式解析数据,例如 JSON 解析、XML 解析等等。解析 XML 文件通常使用 SAX 解析器。本文将介绍如何在 Android 中使用 SAX 解析器解析 XML。
实现
我们将创建一个简单的应用程序,其中包含一个用于显示应用程序标题的文本视图。之后,我们将创建另一个文本视图,用于显示使用 SAX 解析器从 XML 文件解析出的数据。现在让我们进入 Android Studio,创建一个新项目。
步骤 1:在 Android Studio 中创建新项目
按照下图所示,打开 Android Studio。在下图所示的界面中,点击"新建项目"创建一个新的 Android Studio 项目。
点击"新建项目"后,您将看到下图所示的界面。
在此界面中,我们只需选择"空 Activity",然后点击"下一步"。点击"下一步"后,您将看到下图所示的界面。
在此屏幕中,我们只需指定项目名称。然后,包名将自动生成。
注意:请确保选择 Java 作为语言。
指定所有详细信息后,单击"完成"以创建一个新的 Android Studio 项目。
项目创建完成后,我们将看到两个已打开的文件,即 activity_main.xml 和 MainActivity.java 文件。
步骤 2:使用 activity_main.xml
导航到 activity_main.xml。如果此文件不可见,请在左侧窗格中导航到 app>res>layout>activity_main.xml 以打开此文件。打开此文件后,请将以下代码添加到其中。代码中添加了注释,以便您了解详细信息。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- on below line creating the heading of our application -->
<TextView
android:id="@+id/idTVHeading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/idTVParser"
android:layout_margin="10dp"
android:layout_marginTop="90dp"
android:padding="8dp"
android:text="XML Parsing in Android using SAX Parser"
android:textAlignment="center"
android:textColor="@color/black"
android:textSize="20sp"
android:textStyle="bold" />
<!-- on below line creating a list view for displaying the list of programming languages -->
<TextView
android:id="@+id/idTVParser"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_margin="8dp"
android:padding="4dp"
android:textAlignment="center"
android:textColor="@color/black"
android:textSize="18sp" />
</RelativeLayout>
说明 - 在上面的代码中,我们创建了一个根布局,它使用相对布局 (Relative Layout)。在这个布局中,我们创建了一个文本视图 (TextView),用于显示应用程序的标题。之后,我们创建了另一个文本视图,用于显示从 XML 文件解析出的数据。
步骤 3:创建用于存储数据的 XML 文件
导航到 app>java>您的应用程序包名>右键单击>新建文件夹>Assets 文件夹。现在 Assets 文件夹已创建。接下来,我们将在 Assets 文件夹中创建一个 XML 文件。要创建 XML 文件,请导航到 Assets 文件夹,右键单击>新建 Android 资源文件,并将其命名为 file.xml。创建该文件后,将以下代码添加到其中。代码中添加了注释,以便您详细了解其含义。
<?xml version="1.0" encoding="utf-8"?>
<records>
<!-- on below line creating a language and inside that creating a name and description for it -->
<language>
<name>Java</name>
<description>Java is a high-level, class-based, object-oriented programming language that is
designed to have as few implementation dependencies as possible.
</description>
</language>
</records>
步骤 4:使用 MainActivity.java 文件
导航至 MainActivity.java 文件。如果该文件不可见,请在左侧面板中导航至 app>res>layout>MainActivity.java 打开该文件。打开该文件后,将以下代码添加到其中。代码中添加了注释,以便您详细了解其含义。
package com.example.java_test_application;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class MainActivity extends AppCompatActivity {
// 下面这行代码创建文本视图的变量。
private TextView parserTV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 正在初始化下面这行文本视图的变量。
parserTV = findViewById(R.id.idTVParser);
try {
// 下面这行代码创建了一个用于 SAX 解析器工厂的变量。
SAXParserFactory factory = SAXParserFactory.newInstance();
// 下面这行代码用于创建和初始化 sax 解析器的变量。
SAXParser saxParser = factory.newSAXParser();
// 创建一个用于默认处理程序的变量,并在下面的代码行中对其进行初始化。
DefaultHandler handler = new DefaultHandler() {
// 创建一个布尔值来表示语言名称。
boolean name = false;
// 创建一个布尔变量用于语言描述。
boolean description = false;
// 下面这行代码创建了一个方法来检查起始元素。
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// 下面这行代码检查 xml 中是否存在 name 属性,如果存在,则将 name 布尔变量标记为 true。
if (qName.equalsIgnoreCase("name")) {
name = true;
}
// 下面这行检查 XML 中是否存在该语言的描述,如果存在,则将该描述标记为 true。
if (qName.equalsIgnoreCase("description")) {
description = true;
}
}
// 下面这行创建了一个结束元素方法。
public void endElement(String uri, String localName, String qName) throws SAXException {
}
// 下面这行代码通过方法获取字符。
public void characters(char ch[], int start, int length) throws SAXException {
// 下面这行检查名称是否为真
if (name) {
// 在我们的解析文本视图中,设置下面一行的名称。
//将名称更改为 false。
parserTV.setText(parserTV.getText() + new String(ch, start, length) + "
");
name = false;
}
// 下面这行检查描述是否属实。
if (description) {
// 在我们的解析文本视图中,对以下行进行设置描述。
//将描述改为 false。
parserTV.setText("
" + parserTV.getText() + new String(ch, start, length));
description = false;
}
}//end of characters
};//DefaultHandler 对象结束
// 下面这行代码使用输入流获取文件。
InputStream is = getAssets().open("file.xml");
// 下面这行代码使用 SAX 解析器解析文件。
saxParser.parse(is, handler);
// 下面这行代码处理异常。
} catch (Exception e) {
e.printStackTrace();
}
}
}
说明 - 在上面的代码中,我们首先创建了文本视图的变量。现在我们来看看 onCreate 方法。这是每个 Android 应用程序的默认方法。当应用程序视图创建时,会调用此方法。在这个方法中,我们设置内容视图,也就是名为 activity_main.xml 的布局文件,以便从该文件中设置 UI。在 onCreate 方法中,我们使用 activity_main.xml 文件中指定的 id 初始化文本视图变量。之后,我们在一个 try-catch 块中创建并初始化 SAX 解析器工厂、SAX 解析器和默认处理程序的变量。
在这段代码中,我们创建了起始元素和结束元素方法。起始元素方法会检查我们要查找的数据是否存在于 XML 文件中。然后,我们创建了一个字符方法,用于从 XML 文件读取数据并将其设置到文本视图中。之后,我们创建了一个输入流,并将要加载数据的文件名传递给它。在本例中,我们将文件名设置为 file.xml。然后,我们调用 SAX 解析器的 parse 方法来解析数据。最后,我们添加了一个 catch 代码块来处理异常。
添加上述代码后,现在只需点击顶部栏中的绿色图标即可在移动设备上运行我们的应用程序。
注意:请确保您已连接到您的真机或模拟器。
输出
结论
在本文中,我们探讨了如何在 Android 中使用 SAX 解析器解析 XML。

