本篇讲解一下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. 关于RabbitMQ关键性问题的总结

    摘要:本篇是本人对RabbitMQ使用的关键性问题进行的总结,如性能上限.数据存储.集群等, 具体的RabbitMQ概念.安装.使用方法.SpringAMQP配置,假设读者已有了基础. 1.      ...

  2. EBS MOAC

    alter session set nls_language='SIMPLIFIED CHINESE';alter session set nls_language ='AMERICAN'; exec ...

  3. Python 文件夹及文件操作

    import os import os.path from shutil import copy def copyfile(src, dst): count = 1 for filename in o ...

  4. Fortran中的指针使用

    Fortran中的指针如何使用,功能怎样,下面的的5个例子足可以让你明白一切! 对于单个值,用起来很简单,但是无法体现指针的强大功能, 示例1: program test_pointer_1 impl ...

  5. crontab不能执行sudo:抱歉,您必须拥有一个终端来执行 sudo

    最近做一个可执行shell调度的需求,要求用户输入shell,然后后台定时调度运行.实现大致为:保存用户的输入,设定时间,crontab定时执行用户的输入.但这里涉及到一个安全问题,如何确定用户的输入 ...

  6. PL/SQL学习笔记之函数

    一:函数 函数与过程的最大不同就是,函数有返回值.适用于需要返回结果的场景. 二:创建函数 CREATE [OR REPLACE] FUNCTION function_name [(parameter ...

  7. 实现一个原子的正整数类:AtomicPositiveInteger

    import java.util.concurrent.atomic.AtomicInteger; public class AtomicPositiveInteger extends Number ...

  8. linux实现共享内存同步的四种方法

    https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...

  9. Android学习笔记(五一):服务Service(上)- IntentService

    转自 http://blog.csdn.net/flowingflying/article/details/7616333 对于需要长期运行,例如播放音乐.长期和服务器的连接,即使已不是屏幕当前的ac ...

  10. tsung -- 压力测试利器

    Tsung 是一个压力测试工具,可以测试包括HTTP, WebDAV, PostgreSQL, MySQL, LDAP, and XMPP/Jabber等服务器.针对 HTTP 测试,Tsung 支持 ...