JAXP的SAX解析方式(理解过程)

1.JAXP的DOM解析方式和SAX解析方式的区别:

1.DOM:在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。

2.SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

2.JAXP的SAX解析(了解 解析的过程)

2.1* 只能做查询,不能做增删改。

2.2* SAX解析:解析器自动帮我们

1.* 解析器

1.* 获取解析器的工厂

2.* 获取解析器对象

3.* 解析XML(XML的文件的地址,事件处理器:DefaultHandler)         

2.* 事件处理器

* 自己编写的类,需要继承DefalutHandler类,重写三个方法。

* startElement()
* characters()
* endElement()

3. 图示:


4.代码示例:

<pre name="code" class="java">package cn.itcast.jaxp.sax;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class JaxpSaxTest {
	
	public static void main(String[] args) {
		try {
			run1();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取所有的解析内容
	 * 
	 */
	public static void run1() throws Exception{
		//获取SAX的解析工厂
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//获取解析器
		SAXParser parser = factory.newSAXParser();
		//解析
		parser.parse("src/book2.xml", new MyHandler2());
	}
}

/**
 * 获取作者标签文本
 */
class MyHandler2 extends DefaultHandler{

	private boolean flag = false;//解析到作者标签时置为true
	private int count = 0;
	
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if("作者".equals(qName)){
			flag = true;
			count++;
		}
	}
	
	/**
	 * 控制characters的输出,只在解析坐着吧标签的时候才打印
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		//flag为true时才打印
		if(flag && count==1){
			String str = new String(ch, start, length);//将拿到的文本拼接成一个字符串
			System.out.println(str);
		}
		
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		//flag恢复到false
		flag = false;
	}

	
	
}


/**
 * 自己事件处理器
 * 重名三方法
 * 
 */
class MyHandler extends DefaultHandler{

	/**
	 * 只要一解析到开始标签的时候,默认调用该方法,把解析的内容赋值给参数
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		System.out.println("开始标签: " + qName);
	}
	
	/**
	 * 只要解析到文本内容,就调用该方法
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		 String str = new String(ch, start, length);//将拿到的文本拼接成一个字符串
		 System.out.println(str);
	}

	/**
	 * 解析到结束标签,默认调用该方法
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		System.out.println("结束标签: " + qName);
		
	}
}

 
  

2.3* SAX的解析原理:        

解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,(边读边解析)

都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,

会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。


事件处理器由程序员编写,程序员通过事件处理器中方法的参数,

就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值