Android 创建与解析XML(四)——详解Pull方式

对于“Android 创建与解析XML(四)——详解Pull方式”这个话题,我会进行以下几方面的讲解:

  1. Pull方式解析XML文件的特点和基本原理
  2. Pull解析XML的主要API以及使用方式
  3. Pull方式解析XML的示例详解

1. Pull方式解析XML文件的特点和基本原理

在Android中,解析XML文件主要有三种方式:DOM方式、SAX方式和Pull方式。Pull方式作为最简单、最快速的一种方式,它的主要特点有:

  • 处理速度快,在处理大型XML文件时更具优势
  • 不会将整个XML文件载入到内存中,对内存的占用量比较少
  • 缺点是需要我们手动编写处理代码,实现自己需要的功能

Pull方式解析XML的基本原理是通过流的形式从XML文件中读取数据,逐个解析XML标签。同时,通过对特定函数的调用,我们可以获取标签中的各个属性和值。

2. Pull解析XML的主要API以及使用方式

Pull解析XML文件需要用到的几个主要API介绍如下:

  • XmlPullParserFactory:Pull解析XML前需要先初始化一个XmlPullParserFactory对象,用于创建一个解析器对象
  • XmlPullParser:解析器对象,使用Pull解析XML文件时需要通过此对象的相关属性和方法获取XML数据
  • START_DOCUMENTSTART_TAGTEXTEND_TAGEND_DOCUMENT:解析XML文件时的标签类型

在使用Pull解析XML文件时,我们需要按以下的步骤进行操作:

  1. 在程序中创建一个XmlPullParserFactory工厂对象。
  2. 通过XmlPullParserFactory对象的newPullParser()方法,创建一个解析器对象XmlPullParser
  3. 实现解析器对象的setInput()方法,将需要解析的XML数据以流的形式传入。
  4. 通过对解析器对象的相关方法调用,逐个解析XML文件,获取标签的属性值。

3. Pull方式解析XML的示例详解

下面通过一个实例来详细讲解如何使用Pull方式解析XML。

假设我们需要从以下XML文件中获取每一本书籍的ISBN值、图书名称、作者和出版日期等信息。

<?xml version="1.0" encoding="UTF-8"?>
<books>
  <book id="1">
    <isbn>978-7-121-24662-4</isbn>
    <name>Java核心技术(卷一)</name>
    <author>Cay S. Horstmann</author>
    <published-date>2017-03-01</published-date>
  </book>
  <book id="2">
    <isbn>978-7-121-24710-2</isbn>
    <name>Java核心技术(卷二)</name>
    <author>Cay S. Horstmann</author>
    <published-date>2017-06-01</published-date>
  </book>
</books>

首先,我们需要在项目中包含以下依赖:

implementation 'org.xmlpull:xpp3:1.1.4c'

接下来实现一个XmlPullParser解析工具类,包含如下代码:

public class XmlPullParserUtil {
    private static final String TAG = "XmlPullParserUtil";

    /**
     * 解析XML文件,返回指定的book数据对象集合
     *
     * @param inputStream XML文件流数据
     * @return book数据对象集合
     */
    public static List<Book> parseXML(InputStream inputStream) {
        List<Book> books = new ArrayList<>();
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(inputStream, "UTF-8");

            int eventType = parser.getEventType();  // 初始解析状态(开始解析)
            Book book = null;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagName = parser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if ("book".equals(tagName)) {   // 一个新的book标签开始
                            book = new Book();
                            book.setId(Integer.parseInt(parser.getAttributeValue(null, "id")));
                        } else if ("isbn".equals(tagName)) {     // 解析isbn数据
                            if (book != null) {
                                book.setIsbn(parser.nextText());
                            }
                        } else if ("name".equals(tagName)) {    // 解析name数据
                            if (book != null) {
                                book.setName(parser.nextText());
                            }
                        } else if ("author".equals(tagName)) {      // 解析author数据
                            if (book != null) {
                                book.setAuthor(parser.nextText());
                            }
                        } else if ("published-date".equals(tagName)) {    // 解析published-date数据
                            if (book != null) {
                                book.setPublishedDate(parser.nextText());
                            }
                        }
                        break;

                    case XmlPullParser.END_TAG:
                        if ("book".equals(tagName)) {   // 一个book标签解析完成
                            books.add(book);
                            book = null;
                        }
                        break;

                    default:
                        break;
                }
                eventType = parser.next();
            }
        } catch (Exception e) {
            Log.e(TAG, "parseXML error: " + Log.getStackTraceString(e));
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                Log.e(TAG, "close inputStream error: " + Log.getStackTraceString(e));
            }
        }
        return books;
    }
}

然后我们可以在Activity中实现如下示例:

public class MainActivity extends AppCompatActivity {
    private TextView mTvContent;
    private List<Book> mBooks;

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

        initView();

        // 读取books.xml文件,获取其中数据
        mBooks = XmlPullParserUtil.parseXML(getResources().openRawResource(R.raw.books));
        String content = "";
        for (Book book : mBooks) {
            content += "id: " + book.getId()
                    + ", name: " + book.getName()
                    + ", author: " + book.getAuthor()
                    + ", date: " + book.getPublishedDate()
                    + "\n";
        }
        mTvContent.setText(content);
    }

    private void initView() {
        mTvContent = findViewById(R.id.tv_content);
    }
}

通过加载含有XML数据的文件流,再用XmlPullParser工具类解析此流数据,并最终将解析出的结果展示在UI上。

以上就是Pull方式解析XML文件的详细攻略,希望对你有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android 创建与解析XML(四)——详解Pull方式 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • 详解 C# 中XML对象的序列化和反序列化

    下面详细讲解一下C#中XML对象的序列化和反序列化的完整攻略。 1. 什么是XML序列化和反序列化? XML序列化是将对象转换为序列化XML字符串,它将对象的公共属性和字段转换为XML元素和属性,然后将它们写入XML文件或流中,以进行传输和持久性存储。反之,XML反序列化则是将XML字符串转换为对象。 在C#中,.NET Framework提供了一个名为Sy…

    html 2023年5月30日
    00
  • jsp EL表达式详解

    JSP EL表达式详解 什么是JSP EL表达式? JSP EL表达式(JSP Expression Language)是一种简单而强大的语言,用于在JSP页面中访问JavaBean的属性,以及在页面中运算、比较和显示值。它能够简化JSP页面中Java代码的编写,让页面更加易于维护和开发。 在JSP中使用EL表达式可以用${}括起,比如${user.name…

    html 2023年5月30日
    00
  • Spring项目XML文件使用小结

    我们来详细讲解一下“Spring项目XML文件使用小结”的完整攻略。 1. 什么是Spring项目XML文件? Spring项目XML文件就是Spring框架中用于配置项目的XML文件,用来定义Bean、Aspect、AOP等信息。Spring项目XML文件常见的一些配置,如Bean的声明、使用、依赖注入等,以及各种属性的配置和使用。Spring项目XML文…

    html 2023年5月30日
    00
  • Win10系统总是锁屏关闭屏幕该怎么办?

    如果您的Windows 10系统总是锁屏关闭屏幕,以下是解决该问题的详细攻略: 步骤1:检查电源和屏幕设置 单击Windows 10系统的“开始”按钮。 选择“设置”图标。 选择“系统”。 选择“电源和睡眠”。 检查“屏幕关闭”和“睡眠”设置是否正确。 步骤2:禁用屏幕保护程序 单击Windows 10系统的“开始”按钮。 选择“设置”图标。 选择“个性化”…

    html 2023年5月17日
    00
  • Python实现xml格式转txt格式的示例代码

    下面是Python实现xml格式转txt格式的完整攻略,包含示例说明: 1. 安装Python所需的库 在Python环境下实现xml格式转txt格式需要用到xml.etree.ElementTree库。这个库通常情况下已经打包在Python中,所以没有理由不先用这个库来实现xml解析和处理。 同时,还需要安装lxml库来帮助我们在Python中更加高效地解…

    html 2023年5月30日
    00
  • hbuilderx怎么开启显示换行符?hbuilderx开启显示换行符教程

    以下是“HBuilderX怎么开启显示换行符?HBuilderX开启显示换行符教程”的完整攻略: HBuilderX怎么开启显示换行符? 在HBuilderX中开启显示换行符,可以帮助用户更好地查看和编辑代码。以下是一些关于如何开启显示换行符的技巧和步骤,可以帮助用户更好地使用HBuilderX。 技巧1:使用快捷键 在HBuilderX中,用户可以使用快捷…

    html 2023年5月18日
    00
  • Android中主要资源文件及文件夹介绍

    Android中主要资源文件及文件夹介绍 在Android开发中,资源文件的使用非常常见。不同类型的资源文件放在不同的文件夹下,Android的编译器会根据文件夹的名字自动生成R.java类,该类中包含了应用程序中所有资源文件的引用。在这篇文章中,我们将主要介绍Android中主要资源文件及文件夹的介绍。 layout 在Android中,layout文件夹…

    html 2023年5月30日
    00
  • Spring spel获取自定义注解参数值方式

    下面是关于”Spring SpEL获取自定义注解参数值”的完整攻略。 1. 自定义注解 首先,我们需要先定义一个自定义注解,这里以控制器中的自定义注解为例: @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface DemoAnnotation { /*…

    html 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部