本篇讲解一下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