您的位置:首页 > 编程语言 > Java开发

Java XML解析之SAX解析

2016-07-10 13:26 316 查看
SAX(Simple
API for XML)解析:基于事件流的解析。
特点:速度快,文档大小无限制
只读,不能随机访问,不好查找节点
java包:org.xml.sax/org.xml.sax.helpers
常用接口/类:
XMLReader
ContentHandler
DTDHandler
EntityResolver
ErrorHandler
DefaultHandler
DefaultHandler事件举例:
startDocument():
startElement(String
uri, String localName, String qName,Attributes attributes)
characters(char[]
ch, int start, int length)
endElement(String
uri, String localName, String qName)

SAX在读取一行XML文档数据后,就会给感兴趣的用户一个通知!例如当SAX读取到一个元素的开始时,会通知用户当前解析到一个元素的开始标签。而用户可以在整个解析的过程中完成自己的业务逻辑,当SAX解析结束,不会保存任何XML文档的数据。

优点:使用SAX,不会占用大量内存来保存XML文档数据,效率也高。

缺点:当解析到一个元素时,上一个元素的信息已经丢弃,也就是说没有保存元素与元素之间的结构关系,这也大大限制了SAX的使用范围。如果只是想查询XML文档中的数据,那么使用SAX是最佳选择!

编程步骤:
1.准备一个xml文件,和DOM解析一样,movies.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Movies>
<Movie id="1">
<name>愤怒的小鸟</name>
<type>animation</type>
<year>2016</year>
</Movie>
<Movie id="2">
<name>叶问</name>
<type>action</type>
<language>chinese</language>
</Movie>
</Movies>
2.创建SAXParserFactory对象

SAXParserFactory spf=SAXParserFactory.newInstance();


3.创建SAXParser对象

SAXParser saxParser=spf.newSAXParser();


4.解析处理xml文件

saxParser.parse("movies.xml", new MyHandler());


5.然后会在MyHandler处理xml文件

这个类继承了DefaultHandler,下面开始讲解步骤:
(1)开始xml解析:

@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("开始解析");
movielist=new ArrayList<Movie>();
}


(2)开始解析一个元素:

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if(qName.equals("Movie")){
movie=new Movie();
count++;
System.out.println("正在解析第"+count+"部电影");
for(int i=0;i<attributes.getLength();i++){
System.out.println("属性名:"+attributes.getQName(i));
System.out.println("属性值:"+attributes.getValue(i));
if(attributes.getQName(i).equals("id")){
movie.setId(attributes.getValue(i));
}
}
}
}
(3)开始解析每一部电影的文本内容:

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
value=new String(ch,start,length);
if(!value.trim().equals("")){//去除空格之后不是空字符串
System.out.println("节点值:"+value);
}
}


(4)结束解析文档:

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
if(qName.equals("Movie")){
movielist.add(movie);
movie=null;
System.out.println("第"+count+"部电影解析结束");
}
if(qName.equals("year")){
movie.setYear(value);
}else if (qName.equals("name")) {
movie.setName(value);
}else if (qName.equals("language")) {
movie.setLanguage(value);
}else if (qName.equals("type")) {
movie.setYear(value);
}
}


(6)结束xml解析:

@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("结束解析");
}


6.MyHandler完整代码:

public class MyHandler extends DefaultHandler{

private String value;
private int count=0;
private Movie movie;
private ArrayList<Movie>movielist;
@Override public void startDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("开始解析"); movielist=new ArrayList<Movie>(); }

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if(qName.equals("Movie")){
movie=new Movie();
count++;
System.out.println("正在解析第"+count+"部电影");
for(int i=0;i<attributes.getLength();i++){
System.out.println("属性名:"+attributes.getQName(i));
System.out.println("属性值:"+attributes.getValue(i));
if(attributes.getQName(i).equals("id")){
movie.setId(attributes.getValue(i));
}
}
}
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
value=new String(ch,start,length);
if(!value.trim().equals("")){//去除空格之后不是空字符串
System.out.println("节点值:"+value);
}
}
@Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub if(qName.equals("Movie")){ movielist.add(movie); movie=null; System.out.println("第"+count+"部电影解析结束"); } if(qName.equals("year")){ movie.setYear(value); }else if (qName.equals("name")) { movie.setName(value); }else if (qName.equals("language")) { movie.setLanguage(value); }else if (qName.equals("type")) { movie.setYear(value); } }

@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("结束解析");
}
}


7.Sax:

public class Sax {

public static void main(String[] args) {
//1.创建SAXParserFactory对象
SAXParserFactory spf=SAXParserFactory.newInstance();
try {
//2.创建SAXParser对象
SAXParser saxParser=spf.newSAXParser();
saxParser.parse("movies.xml", new MyHandler());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


8.Movie:

public class Movie {

private String id,name,type,language,year;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getLanguage() {
return language;
}

public void setLanguage(String language) {
this.language = language;
}

public String getYear() {
return year;
}

public void setYear(String year) {
this.year = year;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "id:"+id+" "+"name:"+name+" "+"type:"+type+" "+"language:"+language+" "
+"year:"+year;
}
}


效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml SAX解析 java