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

相关文章

  • JSP中实现判断客户端手机类型并跳转到app下载页面

    JSP是JavaServer Pages(Java服务器页面)的缩写,它是一种动态网页技术,允许我们在网页中插入Java代码,从而实现动态内容展示和逻辑控制。要实现判断客户端手机类型并跳转到app下载页面,我们需要从以下几个方面入手: 判断客户端的手机类型 根据不同的手机类型进行分流 跳转到app下载页面 下面具体讲解实现的步骤: 1. 判断客户端的手机类型…

    Java 2023年6月15日
    00
  • C#基于JsonConvert解析Json数据的方法实例

    下面是“C#基于JsonConvert解析Json数据的方法实例”完整攻略,包括了Json的基本概念、JsonConvert工具的使用、示例代码等。 什么是Json Json(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web应用程序之间的数据交互。它基于JavaScript语法,但与JavaScript语言无…

    Java 2023年5月19日
    00
  • java实现ping

    要实现Java的Ping功能,可以使用Java中的InetAddress类和Java的Runtime类的相关方法。 使用InetAddress类的方法实现Ping功能: 可以使用Java中的InetAddress类的isReachable()方法,该方法依赖于底层系统的Ping命令的实现。 下面是使用InetAddress类的示例代码: import jav…

    Java 2023年5月18日
    00
  • javaweb登录验证码的实现方法

    下面是“JavaWeb登录验证码的实现方法”的详细攻略: 什么是验证码 验证码(Verification Code)是一种用于判断用户是否为人类的简单程序,主要目的是防止恶意程序对网站进行暴力破解或网络爬虫行为。常见的验证码包括数字、字母、图片、数学公式等形式,验证码输入错误时,通常会跳出提示框要求重新输入。 JavaWeb登录验证码的实现方法 JavaWe…

    Java 2023年6月15日
    00
  • 把textarea中字符串里含有的回车换行替换成<br>的javascript代码

    将textarea中字符串里含有的回车换行替换成<br>的javascript代码可以通过正则表达式以及字符串操作来实现,具体步骤如下: 第一步:获取textarea中的值 我们可以通过JavaScript来获取textarea中的值,代码示例如下: const textArea = document.querySelector(‘textare…

    Java 2023年6月15日
    00
  • Spring Boot 连接LDAP的方法

    Spring Boot连接LDAP的方法 LDAP(Lightweight Directory Access Protocol)是一种轻量级的目录访问协议,常用于企业级应用程序中的身份验证和授权。在Spring Boot中,我们可以使用Spring LDAP来连接和操作LDAP服务器。本文将详细讲解如何使用Spring LDAP连接LDAP服务器,并提供两个…

    Java 2023年5月15日
    00
  • Java中获取文件大小的详解及实例代码

    下面是关于“Java中获取文件大小的详解及实例代码”的完整攻略: 一、获取文件大小的方法 Java中获取文件大小的方法,可以使用Java File类的length()方法,该方法返回文件的字节数,即文件大小。关于File类的length()方法详见Java文档:https://docs.oracle.com/javase/8/docs/api/java/io…

    Java 2023年5月20日
    00
  • Java如何实现实体类转Map、Map转实体类

    实体类转Map和Map转实体类是Java编程中非常常见的操作,在开发中可以大大提高开发效率和代码质量。下面的攻略将会介绍Java中如何实现实体类转Map和Map转实体类。 实体类转Map 实体类转Map操作可以通过Java语言中的反射机制来实现。在java.lang.reflect包中有一些类可以帮助我们完成这项任务。主要的有Class、Field和Meth…

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