详解Android之解析XML文件三种方式(DOM,PULL,SAX)

yizhihongxing

详解Android之解析XML文件三种方式(DOM,PULL,SAX)

一、引言

在Android开发中,解析XML文件是非常常见的操作,而解析XML文件有多种方式可以选择。本文将详细介绍Android中解析XML文件的三种方式:DOM,PULL和SAX,包括他们的实现原理、使用方法、比较优缺点等。

二、DOM方式解析XML文件

DOM方式解析XML文件是将整个XML文件读入到内存中,然后解析为一个树形结构,最后以DOM树的方式存储在内存中。

1. DOM方式解析XML实现原理

DOM方式将整个XML文件读入到内存中,并解析为一个具有层级结构的文档对象模型(DOM)树,这个树形结构中,每一个节点表示XML文档中的一个元素或属性。

DOM方式的解析流程如下:

1、解析器读取XML文件,并将其转化为一个Document对象。

2、解析器将Document对象中的节点解析为DOM树,每一层节点以及节点的属性都被转化为相应的DOM对象,比如Element对象和Attribute对象等。

3、将DOM树保存在内存中。

2. DOM方式解析XML的优缺点

优点:

1、实现简单易懂。

2、解析完整性好,可以对XML文件进行增、删、改、查等操作。

缺点:

1、较为消耗内存。

2、由于需要将整个XML文件读入内存并解析为DOM树,所以解析大XML文件效率较低。

3. DOM方式解析XML的实现方法

DOM方式解析XML文件需要用到XmlPullParser解析器,具体步骤如下:

1、获取XmlPullParser解析器。

XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();

2、调用XmlPullParser解析器的setInput方法,设置待解析的XML文件输入流。

parser.setInput(inputStream, "utf-8");

3、调用XmlPullParser解析器的next方法,开始解析XML文件。

int eventType = parser.next();
while (eventType != XmlPullParser.END_DOCUMENT) {
    switch (eventType) {
        case XmlPullParser.START_DOCUMENT:
            Log.d(TAG, "start document");
            break;
        case XmlPullParser.START_TAG:
            Log.d(TAG, "start tag: " + parser.getName());
            break;
        case XmlPullParser.END_TAG:
            Log.d(TAG, "end tag: " + parser.getName());
            break;
        case XmlPullParser.TEXT:
            Log.d(TAG, "text: " + parser.getText());
            break;
        default:
            break;
    }
    eventType = parser.next();
}
Log.d(TAG, "end document");

4. DOM方式解析XML工程示例

示例:解析books.xml文件

books.xml文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<books>
    <book>
        <title>Java开发</title>
        <author>张三</author>
        <price>45.00</price>
    </book>
    <book>
        <title>Android开发</title>
        <author>李四</author>
        <price>42.00</price>
    </book>
</books>

解析过程如下:

1、获取XmlPullParser解析器。

XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();

2、创建FileInputStream对象,并将books.xml文件读取为输入流。

FileInputStream inputStream = new FileInputStream(new File(getFilesDir().getPath() + "/books.xml"));

3、设置XmlPullParser解析器的输入流,并设置编码格式。

parser.setInput(inputStream, "utf-8");

4、读取并解析XML文件。

int eventType = parser.next();
while (eventType != XmlPullParser.END_DOCUMENT) {
    switch (eventType) {
        case XmlPullParser.START_DOCUMENT:
            Log.d(TAG, "start document");
            break;
        case XmlPullParser.START_TAG:
            Log.d(TAG, "start tag: " + parser.getName());
            break;
        case XmlPullParser.END_TAG:
            Log.d(TAG, "end tag: " + parser.getName());
            break;
        case XmlPullParser.TEXT:
            Log.d(TAG, "text: " + parser.getText());
            break;
        default:
            break;
    }
    eventType = parser.next();
}
Log.d(TAG, "end document");

输出结果如下:

start document
start tag: books
start tag: book
start tag: title
text: Java开发
end tag: title
start tag: author
text: 张三
end tag: author
start tag: price
text: 45.00
end tag: price
end tag: book
start tag: book
start tag: title
text: Android开发
end tag: title
start tag: author
text: 李四
end tag: author
start tag: price
text: 42.00
end tag: price
end tag: book
end tag: books
end document

三、PULL方式解析XML文件

PULL方式解析XML文件以流的方式对XML文件进行解析,在行进解析的过程中,PULL方式只会获取当前需要处理的节点信息,而不会将整个XML文件读取到内存中。

1. PULL方式解析XML实现原理

PULL方式是以基于事件的方式解析XML文件,使用XmlPullParser解析器,每次解析节点时只获取当前节点的信息,而不会将整个XML文件读取到内存中,从而节约了内存空间。

2. PULL方式解析XML的优缺点

优点:

1、较为消耗内存。

2、解析效率高,适合解析大XML文件。

缺点:

1、需要重复调用next方法获取每个节点的信息,不如DOM方式方便。

3. PULL方式解析XML的实现方法

1、获取XmlPullParser解析器。

XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();

2、调用XmlPullParser解析器的setInput方法,设置待解析的XML文件输入流。

parser.setInput(inputStream, "utf-8");

3、使用while循环,读取并解析XML文件。

while (eventType != XmlPullParser.END_DOCUMENT) {
    switch (eventType) {
        case XmlPullParser.START_DOCUMENT:
            Log.d(TAG, "start document");
            break;
        case XmlPullParser.START_TAG:
            Log.d(TAG, "start tag: " + parser.getName());
            break;
        case XmlPullParser.END_TAG:
            Log.d(TAG, "end tag: " + parser.getName());
            break;
        case XmlPullParser.TEXT:
            Log.d(TAG, "text: " + parser.getText());
            break;
        default:
            break;
    }
    eventType = parser.next();
}
Log.d(TAG, "end document");

4. PULL方式解析XML工程示例

示例:解析books.xml文件

books.xml文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<books>
    <book>
        <title>Java开发</title>
        <author>张三</author>
        <price>45.00</price>
    </book>
    <book>
        <title>Android开发</title>
        <author>李四</author>
        <price>42.00</price>
    </book>
</books>

解析过程如下:

1、获取XmlPullParser解析器。

XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();

2、创建FileInputStream对象,并将books.xml文件读取为输入流。

FileInputStream inputStream = new FileInputStream(new File(getFilesDir().getPath() + "/books.xml"));

3、设置XmlPullParser解析器的输入流,并设置编码格式。

parser.setInput(inputStream, "utf-8");

4、读取并解析XML文件。

int eventType = parser.next();
while (eventType != XmlPullParser.END_DOCUMENT) {
    switch (eventType) {
        case XmlPullParser.START_DOCUMENT:
            Log.d(TAG, "start document");
            break;
        case XmlPullParser.START_TAG:
            Log.d(TAG, "start tag: " + parser.getName());
            break;
        case XmlPullParser.END_TAG:
            Log.d(TAG, "end tag: " + parser.getName());
            break;
        case XmlPullParser.TEXT:
            Log.d(TAG, "text: " + parser.getText());
            break;
        default:
            break;
    }
    eventType = parser.next();
}
Log.d(TAG, "end document");

输出结果如下:

start document
start tag: books
start tag: book
start tag: title
text: Java开发
end tag: title
start tag: author
text: 张三
end tag: author
start tag: price
text: 45.00
end tag: price
end tag: book
start tag: book
start tag: title
text: Android开发
end tag: title
start tag: author
text: 李四
end tag: author
start tag: price
text: 42.00
end tag: price
end tag: book
end tag: books
end document

四、SAX方式解析XML文件

SAX方式解析XML文件是一种基于事件驱动的解析方式,它并不完整地读取XML文档,而是实时流式地“拉”取到每个节点,并触发相应的事件处理器。

1. SAX方式解析XML实现原理

SAX方式解析XML文件是从上到下逐行解析XML文件,当遇到一个节点时,就触发相应的事件处理器,然后继续向下解析,直到解析完整个XML文件。

2. SAX方式解析XML的优缺点

优点:

1、效率高,适合解析大XML文件。

2、比DOM方式占用的内存更小。

缺点:

1、无法对XML文件进行增、删、改操作,只能对XML文件进行读取。

3. SAX方式解析XML的实现方法

1、获取SAXParser解析器。

SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();

2、设置相应的事件处理器。

DefaultHandler handler = new DefaultHandler() {
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        Log.d(TAG, "start document");
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        Log.d(TAG, "end document");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        Log.d(TAG, "start element: " + qName);
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        Log.d(TAG, "end element: " + qName);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        Log.d(TAG, "text: " + new String(ch, start, length));
    }
};

3、使用SAXParser解析器解析XML文件并设置事件处理器。

saxParser.parse(inputStream, handler);

4. SAX方式解析XML工程示例

示例:解析books.xml文件

books.xml文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<books>
    <book>
        <title>Java开发</title>
        <author>张三</author>
        <price>45.00</price>
    </book>
    <book>
        <title>Android开发</title>
        <author>李四</author>
        <price>42.00</price>
    </book>
</books>

创建新的DefaultHandler对象示例如下:

DefaultHandler handler = new DefaultHandler() {
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        Log.d(TAG, "start document");
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
        Log.d(TAG, "end document");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        Log.d(TAG, "start element: " + qName);
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        Log.d(TAG, "end element: " + qName);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        Log.d(TAG, "text: " + new String(ch, start, length));
    }
};

解析过程如下:

1、获取SAXParser解析器。

SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();

2、创建FileInputStream对象,并将books.xml文件读取为输入流。

FileInputStream inputStream = new FileInputStream(new File(getFilesDir().getPath() + "/books.xml"));

3、使用SAXParser解析器解析XML文件并设置事件处理器。

saxParser.parse(inputStream, handler);

输出结果如下:

start document
start element: books
start element: book
start element: title
text: Java开发
end element: title
start element: author
text: 张三
end element: author
start element: price
text: 45.00
end element: price
end element: book
start element: book
start element: title
text: Android开发
end element: title
start element: author
text: 李四
end element: author
start element: price
text: 42.00
end element: price
end element: book
end element: books
end document

五、总结

DOM方式、PULL方式和SAX方式是Android解析XML文件的三种方式,每种方式都有其特点和适用场景。在实际开发中需要根据实际情况选择合适的方式来解析XML文件。

参考链接

  1. Android官方文档-XML储存
  2. Android解析XML文件三种方式

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Android之解析XML文件三种方式(DOM,PULL,SAX) - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Java swing实现的计算器功能完整实例

    下面我将详细讲解如何实现“Java swing实现的计算器功能完整实例”。 简介 在介绍具体的实现方法之前,先简单介绍一下Java Swing。Swing是Java平台上的一组GUI(Graphical User Interface)构件库。它提供了一整套丰富的GUI构件,例如按钮、文本框、标签等。在Java中,通过将这些构件进行组合,就可以构建出各种各样的…

    Java 2023年5月19日
    00
  • IntelliJ IDEA下Maven创建Scala项目的方法步骤

    下面是详细的攻略步骤: 一、前置条件 在开始之前,需要你已经将IntelliJ IDEA和Maven安装并配置好。如果还没有安装和配置,请先安装和配置。 二、创建Maven项目 打开IntelliJ IDEA,选择“File”-“New”-“Project”,在选择窗口中选择Maven,并点击“Next”; 在“New Project”对话框中,填写项目相关…

    Java 2023年5月20日
    00
  • Springboot如何实现自定义异常数据

    自定义异常类 首先,我们需要定义一个自定义异常类,用来处理我们所需要抛出的异常情况。该自定义异常类需要继承RuntimeException或其子类,如IllegalArgumentException等。在自定义异常类中,我们可以添加一些额外的信息字段,以方便我们在异常处理时获取更加详细的异常信息。 下面是一个自定义异常类的示例代码: public class…

    Java 2023年5月27日
    00
  • Java实现图片转换PDF文件的示例代码

    那我根据您提供的主题来详细讲解一下“Java实现图片转换PDF文件的示例代码”的完整攻略。 准备工作 在进行图片转换PDF文件之前,我们需要Java的第三方库itextpdf以及PDF文件生成的路径。 下载itextpdf.jar并将它加入到你的Java项目中,你可以在网上搜索到itextpdf的下载链接,下载完成后将jar文件放入你的项目目录下即可。 指定…

    Java 2023年5月19日
    00
  • Springboot迁移到Micronaut实现过程详解

    我会给出一个“Springboot迁移到Micronaut实现过程”的完整攻略,并提供两个示例说明。 Spring Boot 迁移到 Micronaut 的实现过程 简介 Micronaut 是一个轻量级的 Java 框架,“微型”体积和速度非常快。本文将会详细介绍 Spring Boot 应用迁移到 Micronaut 的过程,在过程中会涉及到如下主题: …

    Java 2023年6月1日
    00
  • 使用java实现http多线程断点下载文件(一)

    我来为您详细讲解“使用java实现http多线程断点下载文件(一)”的完整攻略。 简介 HTTP多线程断点下载是一种常见的文件下载方式,可以大大提高文件下载速度并且在网络中断等情况下可以将下载进度保存,下次重新下载时可以从上次下载的位置继续下载。本文将介绍使用java实现HTTP多线程断点下载文件的方法。 准备工作 在实现HTTP多线程断点下载文件之前,我们…

    Java 2023年5月18日
    00
  • 分析Java中ArrayList与LinkedList列表结构的源码

    分析 Java 中 ArrayList 与 LinkedList 列表结构的源码可以按照以下步骤进行: 1.选用合适的Java版本并下载源码 为了分析 ArrayList 和 LinkedList 的源码,需要先从官网上下载 Java 代码。可以选择 JDK 版本(即所使用的JDK版本),按系统环境选择对应的操作系统版本,并下载源码文件。 2.创建Array…

    Java 2023年5月26日
    00
  • Java数组声明、创建、初始化基础

    下面我们来详细讲解一下Java数组声明、创建、初始化基础的攻略。 什么是Java数组 数组是一种数据结构,可以用来将一系列相同类型的数据存储在同一变量名下。在Java中,数组是一个固定大小的连续内存块,每个元素可以是任何Java数据类型,包括对象和基本类型。 Java数组的声明 Java数组的声明需要明确指定数组的类型、数组名和数组大小。其基本语法如下: t…

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