详解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日

相关文章

  • mall整合SpringSecurity及JWT认证授权实战下

    想要实现基于SpringSecurity和JWT的认证和授权,一般需要遵循以下步骤: 添加相关依赖 添加Spring Security和JWT相关依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boo…

    Java 2023年5月20日
    00
  • spring boot整合jsp及设置启动页面的方法

    下面是详细讲解“spring boot整合jsp及设置启动页面的方法”的完整攻略: 1. 添加依赖 要使用JSP,需要在pom.xml文件中添加以下依赖项: <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-em…

    Java 2023年6月15日
    00
  • java实现航班信息查询管理系统

    Java实现航班信息查询管理系统攻略 系统概述 航班信息查询管理系统是管理机场航班信息的系统,它可以提供航班信息的查询、添加、修改和删除等功能。该系统使用Java语言进行开发,采用MVC架构,使用MySQL数据库存储数据。 系统需求 该系统具备以下功能: 前端页面展示所有航班信息。 管理员登录,可添加、修改和删除航班信息。 普通用户不需要登录,可查询航班信息…

    Java 2023年5月24日
    00
  • Java之jdbc连接mysql数据库的方法步骤详解

    下面是Java连接MySQL数据库的步骤详解: 步骤1:加载MySQL JDBC驱动 在Java程序中使用JDBC连接MySQL数据库之前,必须先加载MySQL的JDBC驱动。MySQL提供了两种驱动:JDBC驱动和JDBC4.0及以上的驱动。我们使用JDBC驱动来连接。 Class.forName("com.mysql.jdbc.Driver&q…

    Java 2023年5月19日
    00
  • Java Object定义三个点实现代码

    关于“Java Object定义三个点实现代码”的攻略,我来给您详细解释一下。 什么是 Java Object 定义三个点? Java Object 定义三个点是指 Java 对象中定义的三个点:hashCode()、equals() 和 toString()。这三个点是 Java 的基本组成部分,很多情况下需要通过它们来实现对象的比较、打印和哈希等操作。 …

    Java 2023年5月26日
    00
  • maven install报错中程序包xxx不存在的问题解决

    这里是“maven install报错中程序包xxx不存在的问题解决”的完整攻略。 问题描述 在使用Maven构建项目时,有时候会遇到类似如下错误信息: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-co…

    Java 2023年5月19日
    00
  • Spring\SpringBoot配置连接数据库的方法

    下面是Spring\SpringBoot配置连接数据库的方法的完整攻略。 1. Spring中配置连接数据库的方法 1.1 在Spring配置文件中配置 在Spring配置文件中配置连接数据库的方式是最常见的方法。 <!– 数据库连接信息 –> <bean id="dataSource" class="or…

    Java 2023年5月20日
    00
  • Java Mybatis框架由浅入深全解析中篇

    Java Mybatis框架由浅入深全解析中篇 本文将从Mybatis框架的基本配置、映射器、插件、缓存、批处理等方面进行全面介绍,以帮助读者更好地理解和使用Mybatis框架。 基本配置 Mybatis框架的基本配置包括数据库信息、连接池、日志等。这些配置都可以在mybatis-config.xml中进行设置。下面是一个基本的mybatis-config.…

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