Java XML解析之SAX解析

SAXSimple 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;
	}
}

效果图:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值