Android 之XML数据解析(2)—— SAX解析

(以下文章基本照抄郭霖大神的《第一行代码》)

Android之 解析XML文件(1)—— Pull解析 中我们讲了Pull方式解析XML文件。今天讲另外一种方式,SAX解析XML文件。

首先还是先看代码。

一、 SAX解析参考代码

private void parseXMLWithSAX(String xmlData){
    try{
        SAXParserFactory factory = SAXParserFactory.newInstance();
        XMLReader xmlReader = factory.newSAXParser().getXMLReader();
        ContentHandler handler = new ContentHandler();
        //将ContentHandler的实例设置到XMLReader中
        xmlReader.setContentHandler(handler);
        //开始执行解析
        xmlReader.parse(new InputSource(new StringReader(xmlData)));
    }catch(Exception e){
        e.printStackTrace();
    }
}

这里我们看到SAX解析看起来要比Pull解析简洁明了很多。

二、 相关类简介

1、 SAXParserFactory 

SAXParserFactory 与 XmlPullParserFactory类相似。也是提供SAXParser 实例的一个工厂。

下面是Android API中对 SAXParserFactory类的定义。

下面是SAXParserFactory中定义的方法。代码中使用到的 newInstance() 与 newSAXParser() 分别用于产生一个SAXParserFactory实例和产生一个SAXParser实例。

2、XMLReader

XMLReader是一个接口。通过它的setContentHandler()方法,可以设置解析事件的处理handler,通过parse()方法可以开始解析。

XMLReader的实例是通过SAXParser类的 getXMLReader()方法来获取的。

3、ContentHandler

上诉代码中ContentHandler类是我们自己写的类,继承自DefaultHandler类。DefaultHandler类是SAX2事件处理的默认基础类。

它提供了在四个核心的SAX处理类中的所有回调的默认实现。我们可以继承该类,在对应的方法中重写我们的处理逻辑。

下面是Android API中对DefaultHandler类的描述。

我们继承的DefaultHandler类 具体代码如下:

public class ContentHandler extends DefaultHandler{

    private String nodeName;
    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;

    //初始化
    @Override
    public void startDocument() throws SAXException{
        id = new StringBuilder();
        name = new StringBuilder();
        version = new StringBuilder();
    }

    @Override
    public void startElement(String uri,String localName,
        String qName,Attributes attributes) throws SAXException{
            //记录当前结点名
            nodeName = localName;
    }

    @Override
    public void characters(char[] ch,int start,
        int length) throws SAXException{
        //根据当前结点名判断将内容添加到哪一个StringBuilder对象中
        if("id".equals(nodeName)){
            id.append(ch,start,length);
        }else if("name".equals(nodeName)){
            name.append(ch,start,length);
        }else if("version".equals(nodeName)){
            version.append(ch,start,length);
        }
    }

    @Override
    public void endElement(String uri,String localName,
        String qName) throws SAXException{
        if("app".equals(localName){
            Log.d("ContentHandler","id is" + id.toString().trim());
            Log.d("ContentHandler","name is" + name.toString().trim());
            Log.d("ContentHandler","version is" + version.toString().trim());
            //最后还要讲StringBuilder清空
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }

    @Override
    public void endDocument throws SAXException{
    }
}

可以看到在ContentHandler这个处理类中对xml数据的处理方式与Pull解析是类似的。所以SAX解析只不过是将解析用到的方法封装起来,代码书写的时候逻辑更为清晰。

综上,使用SAX解析XML数据我们需要做以下几步:

1、使用SAXParserFactory 类中的newInstance()方法获取SAXParserFactory 类实例。

2、通过SAXParserFactory 类实例的newSAXParser()方法获取SAXParser实例

3、通过SAXParser实例的getXMLReader()获取XMLReader的实例

4、XMLReader实例调用setContentHandler(ContentHandler contentHandler)方法设置解析所需的处理事件

5、自定义一个类继承自 DefaultHandler,重写我们需要的方法(这些方法里面是我们用于处理XML数据的逻辑)。

6、最后调用XMLReader的parse()方法解析数据。

时间: 2024-12-18 22:50:45

Android 之XML数据解析(2)—— SAX解析的相关文章

XML解析之SAX解析技术案例

Java代码: package com.xushouwei.xml; import java.io.File; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import java

Android中XML数据解析

转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML(Extensible Markup Language的缩写,意为可扩展的标记语言),它是一种元标记语言,即定义了用于定义其他特定领域有关语义的.结构化的标记语言,这些标记语言将文档分成许多部件并对这些部件加以标识.XML 文档定义方式有:文档类型定义(DTD)和XML Schema.DTD定义了文

android基础---->XMl数据的解析

在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据.解析XML 格式的数据其实也有挺多种方式的,本节中我们学习比较常用的两种,Pull解析和SAX 解析. 目录导航 Pull解析的用法 Pull解析的代码 Sax解析的用法 Sax解析的代码 Sax与Pull的比较 友情链接 Pull解析的用法 一.我们常用的五个事件: START DOCUMENT:文档开始时,解析器还没有读取任何数据 START_TAG:解析到标签开头 TEXT:解析到元素的内容 E

非常简单的XML解析(SAX解析、pull解析)

这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 1 package com.example.demo.service; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import javax.xml.parsers.DocumentBuilder; 7 import javax.xml.parsers.DocumentBuilderFactory; 8 import javax.xml.parse

XML 解析---dom解析和sax解析

目前XML解析的方法主要用两种: 1.dom解析:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML文档加载到内存中,生成该XML文档对应的document对象,然后把XML文档中的各个标签元素变成相应的Element对象,文本会变成Text对象,属性会变成Attribute对象,并按这些标签.文本.属性在XML文档中的关系保存这些对象的关系. 缺点:消耗内存,所以使用dom解析XML文档时不能解

XML解析(二) SAX解析

XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得. 注意SAXParser的parse()方法: parse(String uri, DefaultHandler dh),parse(File f, DefaultHandler dh)等都需要传递一个DefaultHandler的对象. 查看API帮助手册可知,SAX解析是事件驱动的,De

JavaWeb-05 XML基础(Dom解析和Sax解析)

JavaWeb-05 JavaWeb-XML基础(Dom解析和Sax解析) 一.XML的概述(了解) eXtensible Markup Language 可扩展标记语言 宗旨是传输数据,而非显示数据. XML标签没有被预定义,需要用户自行定义标签. XML技术是W3C组织(WorldWideWeConsortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范. 作用: a. 传输数据 b. 配置文件(主要用途) XML技术用于解决什么问题? a. XML语言出现

2018/1/1 XML和DOM、SAX解析

1.XML (1)描述带关系的数据(软件的配置文件) (2)数据的载体(小型的"数据库")2.语法:标签: 标签名不能以数字开头,中间不能有空格,区分大小写.有且仅有一个根标签.属性: 可有多个属性,但属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单双混用.文档声明: <?xml version="1.0" encoding="utf-8"?> encoding="utf-8": 打开或解析xml文档时

java解析XML① 之DOM解析和SAX解析(包含CDATA的问题)

Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都会调用相应方法,我们可以在这些

javaweb学习总结十二(JAXP对XML文档进行SAX解析)

一:JAXP使用SAX方式解析XML文件 1:dom解析与sax解析异同点 2:sax解析特点 二:代码案例 1:xml文件 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <students> 3 <student> 4 <name sid="111">李四</name> 5 <age>