如何在Android中使用SAX解析器解析XML?


简介

Android是一个开源的操作系统,它基于由Google开发的Linux内核。我们可以在Android应用程序中使用多种方法来解析数据,例如JSON解析、XML解析等等。对于XML文件的解析,可以使用SAX解析器。在本文中,我们将了解如何在Android中使用SAX解析器解析XML。

实现

我们将创建一个简单的应用程序,其中我们将创建一个TextView用于显示应用程序的标题。之后,我们将创建另一个TextView,用于显示使用SAX解析器从XML文件解析的数据。现在让我们转到Android Studio,在Android Studio中创建一个新项目。

步骤1:在Android Studio中创建新项目

导航到Android Studio,如下面的屏幕截图所示。在下面的屏幕截图中,点击“新建项目”以创建一个新的Android Studio项目。

点击“新建项目”后,您将看到下面的屏幕。

在此屏幕中,我们只需选择“空活动”并点击“下一步”。点击“下一步”后,您将看到下面的屏幕。

在此屏幕中,我们只需指定项目名称。然后包名将自动生成。

注意:确保选择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>

说明 - 在上面的代码中,我们创建了一个根布局作为相对布局。在此布局内,我们创建了一个TextView,用于显示应用程序的标题。之后,我们创建了另一个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 {
   // creating variable for text view on below line.
   private TextView parserTV;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       // initializing variables for text view on below line.
       parserTV = findViewById(R.id.idTVParser);
       try {
           // creating a variable for sax parser factory on below line.
           SAXParserFactory factory = SAXParserFactory.newInstance();
           // creating and initializing variable for sax parser on below line.
           SAXParser saxParser = factory.newSAXParser();
           // creating a variable for default handler and initializing it on below line.
           DefaultHandler handler = new DefaultHandler() {
               // creating a boolean for language name..
               boolean name = false;
               // creating a boolean variable for kanguage description.
               boolean description = false;

               // on below line creating a method to check start element.
               public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                   // on below line checking if name is present in the xml and of present marking the name boolean variable as true.
                   if (qName.equalsIgnoreCase("name")) {
                       name = true;
                   }
                   // on below line checking if description for the language is present in the xml and then marking the description also as true.
                   if (qName.equalsIgnoreCase("description")) {
                       description = true;
                   }
               }

               // on below line creating an end element method.
               public void endElement(String uri, String localName, String qName) throws SAXException {
               }

               // on below line getting characters from the method.
               public void characters(char ch[], int start, int length) throws SAXException {
                   // on below line checking if name is true
                   if (name) {
                       // on below line setting name in our parse text view.
                       // changing the name to false.
                       parserTV.setText(parserTV.getText() + new String(ch, start, length) + "

"); name = false; } // on below line checking if description is true. if (description) { // on below line setting description in our parse text view. // changing the description to false. parserTV.setText("

" + parserTV.getText() + new String(ch, start, length)); description = false; } }//end of characters };//end of DefaultHandler object // on below line getting thr file using input stream. InputStream is = getAssets().open("file.xml"); // on below line parsing the file using sax parser saxParser.parse(is, handler); // on below line handling the exception. } catch (Exception e) { e.printStackTrace(); } } }

说明 - 在上面的代码中,首先我们为TextView创建变量。现在我们将看到onCreate方法。这是每个Android应用程序的默认方法。当应用程序视图创建时,将调用此方法。在此方法内,我们设置内容视图,即名为activity_main.xml的布局文件,以从该文件设置UI。在onCreate方法内,我们使用我们在activity_main.xml文件中给定的id初始化TextView变量。之后,我们在try-catch块中创建并初始化SAX Parser Factory、SAX Parser和Default handler变量。

在此,我们创建了一个startElement方法和一个endElement方法。startElement方法将检查我们正在搜索的数据是否存在于XML中。然后,我们创建了一个characters方法,用于从XML文件读取数据并将该数据设置到我们的TextView中。之后,我们创建了一个InputStream并传递我们要加载数据的文件名。在我们的例子中,我们传递文件名file.xml。然后,我们调用sax解析器的parse方法来解析数据。最后,我们添加了一个catch块用于异常处理。

添加上述代码后,我们只需点击顶部栏中的绿色图标即可在移动设备上运行我们的应用程序。

注意:确保已连接到您的真实设备或模拟器。

输出

结论

在本文中,我们了解了如何在Android中使用SAX解析器解析XML。

更新于: 2023年5月9日

398 次浏览

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告