详解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 如何读取Excel格式xls、xlsx数据工具类

    Java如何读取Excel格式xls、xlsx数据 在Java中,我们可以使用POI库来操作Excel文件,这个库支持读取和写入Excel文件。下面我们将通过两个示例来讲解如何读取Excel格式xls、xlsx数据。 示例1:读取Excel文件中的数据 首先我们需要引入相关依赖。在pom.xml文件中添加以下配置: <dependencies> …

    Java 2023年5月19日
    00
  • maven中心仓库OSSRH使用简介(推荐)

    Maven中心仓库OSSRH使用简介(推荐) 如果你是一位Maven项目的开发者,那么你一定会遇到需要将你的项目打包上传到Maven中央仓库的情况。Maven中央仓库是Maven项目的官方仓库,大多数的第三方依赖库都可以在Maven中央仓库上找到。然而,如果你是一个独立的开发者或者组织,你不一定能够将你的项目上传到Maven中央仓库,那么你需要寻找其他的Ma…

    Java 2023年5月19日
    00
  • javascript实现tab响应式切换特效

    JavaScript实现tab响应式切换特效是一个常见的Web开发任务。以下是详细的攻略步骤: 1. HTML结构 首先,我们需要为tab切换效果定义HTML结构。考虑到tab切换通常包含标题和内容两部分,我们可以按照以下结构定义: <div class="tabs"> <ul class="tab-title…

    Java 2023年6月15日
    00
  • java开发命名规范总结

    Java开发命名规范总结 在Java开发中,好的变量、方法、类的命名可以提高代码的可读性和可维护性,也是Java开发人员必须熟悉和掌握的基本规范之一。本文将介绍Java命名规范的常见规则,帮助Java开发人员合理命名。 变量命名规范 可读性为上 变量命名应该明显、具有可读性和可理解性,且要体现变量的含义和作用。一般建议使用英文单词或拼音加上数字或下划线来表示…

    Java 2023年5月26日
    00
  • java获取properties属性文件示例

    当我们需要在Java程序中读取properties属性文件时,通常可以使用java.util.Properties类来实现。下面是实现此操作的完整攻略: 1. 获取properties文件 首先需要获取到带有相关属性的properties文件,可以通过在项目中创建文件或者从外部导入文件的方式进行获取。假设我们已经有了一个示例属性文件”example.prop…

    Java 2023年5月19日
    00
  • Linux下启动tomcat的方法

    下面是详细讲解“Linux下启动tomcat的方法”的完整攻略。 Linux下启动tomcat的方法 Tomcat是一种用于Java开发的Web服务器,它可运行在Windows和Linux等多种操作系统上。在Linux下启动Tomcat需要以下步骤: 步骤一:下载并安装Tomcat 首先需要下载Tomcat,并将其安装在Linux的合适目录下。可以从Tomc…

    Java 2023年5月19日
    00
  • Java系统运行缓慢等问题的排查思路

    我来详细讲解一下“Java系统运行缓慢等问题的排查思路”的完整攻略。 1. 问题定位 首先,我们需要明确具体的问题现象。如果Java系统运行缓慢,可能会有以下一些表现形式: 请求响应时间过长 CPU占用率较高 内存使用率较高 日志输出异常 根据问题现象,我们可以使用以下一些工具来定位问题: 配置管理工具:例如Ansible、Puppet,可以帮助我们收集系统…

    Java 2023年5月24日
    00
  • 27基于java的学生在线考试系统

    一、项目简介 随着互联网迅速发展,人们的生活已经越来越离不开互联网,人们足不出户就可以工作、学习等。对于在校学生,通过网络教育不仅可以随时进行网络学习,也可以根据学习的情况自我检测,有利于学生高效、快捷地掌握所学的知识。本系统预设计的基于网络的学生自测系统将实现多种用户(包括学生、教师、管理员)同时访问,学生登录后可以针对课程的每一章节的每一道题目,提交答案…

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