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

详解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实现FIFO任务调度队列策略

    Java实现FIFO任务调度队列策略 策略说明 先进先出(FIFO)是一种简单的队列策略,其工作原理是最先进入队列的任务先被执行,后面加入的任务排在后面等待执行。Java中提供了多种数据结构可以实现FIFO队列策略,例如LinkedList、ArrayDeque等。 实现步骤 初始化一个队列对象: Queue<Task> taskQueue = …

    Java 2023年5月19日
    00
  • 谈谈为JAXB和response设置编码,解决wechat4j中文乱码的问题

    针对“谈谈为JAXB和response设置编码,解决wechat4j中文乱码的问题”,我为你提供以下攻略: 如何为JAXB设置编码 1. 设置XML文件头部 在编写JAXB应用程序时,首先需要设置XML文件头部,以确保正确解析XML内容。通常在XML文件头部加上<?xml version=”1.0″ encoding=”UTF-8″ standalon…

    Java 2023年5月20日
    00
  • Cookie在Java中的使用

    下面是详细讲解 Cookie 在 Java 中使用的攻略: 一、什么是 Cookie Cookie 是存储在用户计算机上的小型文本文件,用于存储 Web 服务器如何处理用户的操作的信息。它可以帮助网站在用户访问过程中存储一些用户信息,例如用户的用户名、购物车信息、上次登录时间等等。Cookie 可以在服务器和客户端之间交换,以使得用户在多个 Web 页面之间…

    Java 2023年6月15日
    00
  • 通过源代码分析Mybatis的功能流程详解

    下面我将为您详细讲解“通过源代码分析Mybatis的功能流程详解”的完整攻略。 一、前置知识 在进行源代码分析Mybatis的功能流程之前,我们首先需要了解以下知识: Mybatis 的基本原理和工作流程:其中包括 Mybatis 的核心组件(SqlSessionFactory、SqlSession、Mapper、Executor、StatementHand…

    Java 2023年5月20日
    00
  • SpringBoot注入自定义的配置文件的方法详解

    当我们开发一个SpringBoot应用时,我们通常需要使用一些配置文件来配置我们的应用程序,例如application.properties或application.yml文件。但是,有时我们需要注入我们自己的配置文件,例如redis.properties或mysql.properties等。那么,本文将介绍如何将自定义配置文件注入到SpringBoot应用…

    Java 2023年5月26日
    00
  • 实例解决Java异常之OutOfMemoryError的问题

    实例解决Java异常之OutOfMemoryError的问题 背景 在Java应用程序中经常会遇到异常。其中一个比较常见的异常是OutOfMemoryError,这个问题的出现通常是由于应用程序在运行时申请了过多的内存从而导致内存不足的情况。 解决方案 要解决这个问题,有几个方法可以尝试: 1. 增加JVM内存大小 如果你的应用程序需要更多的内存,可以通过设…

    Java 2023年5月27日
    00
  • vue页面引入three.js实现3d动画场景操作

    实现3D动画场景操作主要需要用到three.js这个3D渲染库,Vue.js则用来搭建页面及进行数据的渲染,下面将详细介绍如何在Vue页面中引入three.js实现3D动画场景操作。 第一步:安装three.js 可以使用npm安装three.js: npm install three 如果不想使用npm,可以通过三种方式引入: 下载压缩包,解压后在html…

    Java 2023年5月23日
    00
  • 伪静态技术介绍与优缺点分析(较完整篇)

    伪静态技术介绍与优缺点分析 什么是伪静态技术 伪静态技术是一种将动态网页的 URL 地址转化为静态的 URL 地址的技术。在使用伪静态技术之前,网页 URL 地址通常是动态的,参数较多,访问时不够美观和简洁。而伪静态则是将这些动态的 URL 转化为静态的 URL,提高了用户体验和 SEO 表现。 伪静态技术的实现方法 伪静态技术的实现方法可分为两种: 1. …

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