本篇讲解一下SAX解析XML这种方式,首先来看一下它的基本介绍:

SAX是一种以事件驱动的XML API,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML结构,简单的讲,它是种解析速度快,占用内存少的解析器。这种解析器比较适合android等移动设备。

使用SAX的优点:

因为SAX的优势是流的处理方式,当遇到一个标签的时候,并不会记录下当前所碰到的标签。也就是说,startElement的方法中,你所知道的信息,仅仅是当前的签名的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元素与其他结构相关的信息,都是不知道的。

我们需要使用DefaultHandler这个类来解析

类 DefaultHandler

java.lang.Object
org.xml.sax.helpers.DefaultHandler

我们通过一个简单的实例来看一下如何使用SAX解析XML这门技术:

工程目录结构

几个重要java类的源代码:

MyHandler.java

 package com.sax.handler;

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class MyHandler extends DefaultHandler{
private HashMap<String,String> map = null; //存储单个解析出来的对象
private List<HashMap<String,String>> list = null; //存储所有解析出来的对象
private String currentTag = null; //正在解析的元素的标签
private String currentValue = null; //当前解析的元素的值
private String nodeName; //当前解析的结点名称 public MyHandler(String nodeName) {
this.nodeName = nodeName;
} public List<HashMap<String, String>> getList() {
return list;
}
//当读取到第一个开始标签时候触发该事件
@Override
public void startDocument() throws SAXException {
list = new ArrayList<HashMap<String,String>>();
} //当的读取到一个开始元素时触发该事件
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals(localName)){
map = new HashMap<String, String>();
if(attributes!=null && map!=null){
for(int i=0;i<attributes.getLength();i++){
map.put(attributes.getQName(i), attributes.getValue(i));
}
}
}
currentTag = qName;
}
//当获取元素的值时候触发调用
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(currentTag!=null && map!=null){
currentValue = new String(ch, start, length);
if(currentValue!=null && !currentValue.trim().equals("") && !currentValue.trim().equals("\n")){
map.put(currentTag, currentValue);
}
}
//获取完毕重置值
currentTag = null;
currentValue = null;
}
//遇到结束标记的时候调用这个方法
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(qName.equals(nodeName)){
list.add(map);
map = null;
}
} }

SaxService.java

 package com.sax.service;

 import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.sax.handler.MyHandler; public class SaxService { public SaxService() {
} public static List<HashMap<String,String>> readXml(InputStream inputStream,String nodeName){
//创建一个解析XML工厂对象
SAXParserFactory spf = SAXParserFactory.newInstance();
MyHandler myHandler = new MyHandler(nodeName);
try {
SAXParser parser = spf.newSAXParser();
parser.parse(inputStream, myHandler);
inputStream.close(); } catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return myHandler.getList();
} }

HttpUtils.java

 package com.sax.http;

 import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; public class HttpUtils { public HttpUtils() {
} public static InputStream getXML(String path){
InputStream inputStream = null;
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(3000);
conn.setRequestMethod("GET");
int code = conn.getResponseCode();
if(code == 200){
inputStream = conn.getInputStream();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return inputStream;
}
}

Test.java

 package com.sax.test;

 import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sax.http.HttpUtils;
import com.sax.service.SaxService; public class Test { public Test() {
super();
} /**
* @param args
*/
public static void main(String[] args) {
String path = "http://192.168.56.1:8099/web/person.xml";
InputStream inputStream = HttpUtils.getXML(path);
List<HashMap<String,String>> list = SaxService.readXml(inputStream, "person");
for(HashMap map:list){
System.out.println(map.toString());
}
} }

参考自:http://blog.csdn.net/wulianghuan/article/details/8613101

Android SAX解析XML的更多相关文章

  1. android sax解析xml 文件 动态加载标题

    要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...

  2. Android之SAX解析XML

    一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...

  3. Android 使用pull,sax解析xml

    pull解析xml文件 1.获得XmlpullParser类的引用 这里有两种方法 //解析器工厂 XmlPullParserFactory factory=XmlPullParserFactory. ...

  4. [置顶] Android学习系列-Android中解析xml(7)

    Android学习系列-Android中解析xml(7) 一,概述 1,一个是DOM,它是生成一个树,有了树以后你搜索.查找都可以做. 2,另一种是基于流的,就是解析器从头到尾解析一遍xml文件.   ...

  5. cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)

    今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会 ...

  6. SAX解析xml浅析

    SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序.使用SAX的优势在于其解析速度较快,占用内存较少(相对 ...

  7. Dom,pull,Sax解析XML

    本篇随笔将详细讲解如何在Android当中解析服务器端传过来的XML数据,这里将会介绍解析xml数据格式的三种方式,分别是DOM.SAX以及PULL. 一.DOM解析XML 我们首先来看看DOM(Do ...

  8. Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  9. 安卓SAX解析XML文件

    XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...

随机推荐

  1. Struts与jsp+javabean+servlet区别

    采用Struts框架技术和直接使用jsp+javabean技术开发各有什么优势?各自的缺点又是什么? 在Javaweb开发领域存在2种开发模式, 模式一,jsp+javabean 模式二,jsp+ja ...

  2. 解决springboot druid 数据库批量更新错误问题

    原文:https://www.2cto.com/kf/201712/706399.html springboot druid 数据库多SQL错误multi-statement not allow Ca ...

  3. EBS R12.2.4 Changing IP

    [root@ebs ~]# vi /etc/hosts 127.0.0.1       localhost.localdomain   localhost ::1     localhost6.loc ...

  4. Selenium2+python自动化73-定位的坑:class属性有空格

    前言 有些class属性中间有空格,如果直接复制过来定位是会报错的InvalidSelectorException: Message: The given selector u-label f-dn ...

  5. 1.2 Stream API

    引例: List<String> strList = Arrays.asList("zhaojigang","nana","tianya& ...

  6. 监控JVM内存使用情况,剩余空间小于2M时报警

    一个简单的类,用来监控JVM内存使用情况,剩余空间小于2M时报警. import java.lang.management.ManagementFactory; import java.lang.ma ...

  7. 12C -- ORA-65005: missing or invalid file name pattern for file

    克隆pdb创建新的pdb的时候遇到了以下的错误,具体过程如下文.数据库版本:12.2.0.1 查看已有pdb的tempfile文件 SQL> select name from v$tempfil ...

  8. Warning: Function created with compilation errors.

    SQL> create or replace function 2 remove_constants(p_query in varchar2) return varchar2 3 as 4 l_ ...

  9. ORACLE物化视图(物理视图)

    百度文库 http://wenku.baidu.com/view/f78f55c68bd63186bcebbc4b.html ORACLE物化视图 一.------------------------ ...

  10. SNF快速开发平台3.0之BS页面展示和九大优点-部分页面显示效果-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout

    一)经过多年的实践不断优化.精心维护.运行稳定.功能完善: 能经得起不同实施策略下客户的折腾,能满足各种情况下客户的复杂需求. 二)编码实现简单易懂.符合设计模式等理念: 上手快,见效快.方便维护,能 ...