SAX解析原理

SAX解析工具   

                                             SAX解析工具-  Sun公司提供的。内置在jdk中。org.xml.sax.*

 

                                             核心的API:

                                                         SAXParser类: 用于读取和解析xml文件对象

                                                                        parse(File f, DefaultHandler dh)方法: 解析xml文件

                                   

                                                      参数一: File:表示 读取的xml文件。

                                                 参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

例如:{

                  1.创建SAXParser对象 

              SAXParser parser=SAXParserFactory.newInstance().newSAXParser();

                  2.调用parse方法

            parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());

              [一个类继承class 类名(extends DefaultHandler  在调用是创建传进去

 

                                    DefaultHandler类的API:

                                                      void startDocument()  :  在读到文档开始时调用

                                                      void endDocument()  :在读到文档结束时调用

                                                      void startElement(String uri, String localName, String qName, Attributes attributes)  :读到开始标签时调用                                    

                                                      void endElement(String uri, String localName, String qName)   :读到结束标签时调用

                                                      void characters(char[] ch, int start, int length)  读到文本内容时调用

 

                                   

                                             ============DOM解析    vs   SAX解析               ========

        

DOM解析

SAX解析

原理: 一次性加载xml文档,不适合大容量的文件读取

原理: 加载一点,读取一点,处理一点。适合大容量文件的读取

DOM解析可以任意进行增删改成

SAX解析只能读取

DOM解析任意读取任何位置的数据,甚至往回读

SAX解析只能从上往下,按顺序读取,不能往回读

DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单。

SAX解析基于事件的编程方法。java开发编码相对复杂。

 

                  总结:

                                    1)Dom4j修改xml文档

                                              new XMLWrier();

                                                      ......

                                    2)xPath技术: 快速查询xml节点

                                                      selectNodes()

                                                      selectSinglNode();

                                             xpath表达式语言          

                                    3)  SAX解析

                                                      SAXParser parse

                                                               parser()

                                             DefaultHandler类:

                                                               startElement();

                                                               characters();

                                                               endElement();

原理图

例子:

使用sax解析把 xml文档封装成对象:

package gz.itcast.c_sax;

import java.io.File;
import java.util.List;

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

/**
 * 使用sax解析把 xml文档封装成对象
 * @author APPle
 *
 */
public class Demo3 {

	public static void main(String[] args)throws Exception {
		SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
		MyDefaultHandler3 handler = new MyDefaultHandler3();
		parser.parse(new File("./src/contact.xml"), handler);
		List<Contact> list = handler.getList();
		for (Contact contact : list) {
			System.out.println(contact);
		}
	}
}

 实现

package gz.itcast.c_sax;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * SAX处理程序
 * @author APPle
 *
 */
public class MyDefaultHandler3 extends DefaultHandler {
	//存储所有联系人对象
	private List<Contact> list = new ArrayList<Contact>();
	
	public List<Contact> getList(){
		return list;
	}
	//保存一个联系人信息
	private Contact contact;
	/**
	 * 思路: 
	 * 	1)创建Contact对象
	 *  2)把每个contact标签内容存入到Contact对象
	 *  3)把Contact对象放入List中
	 */
	//用于临时存储当前读到的标签名
	private String curTag;

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		curTag = qName;
		//读取到contact的开始标签创建Contact对象
		if("contact".equals(qName)){
			contact = new Contact();
			
			//设置id值
			contact.setId(attributes.getValue("id"));
		}
	}
	
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		//当前文本内容
		String content = new String(ch,start,length);
		
		if("name".equals(curTag)){
			contact.setName(content);
		}
		
		if("age".equals(curTag)){
			contact.setAge(content);
		}
		
		if("phone".equals(curTag)){
			contact.setPhone(content);
		}
		
		if("email".equals(curTag)){
			contact.setEmail(content);
		}
		
		if("qq".equals(curTag)){
			contact.setQq(content);
		}
	}
	
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		//设置空时为了避免空格换行设置到对象的属性中
		curTag = null;
		//读到contact的结束标签放入List中
		if("contact".equals(qName)){
			list.add(contact);
		}
	}
}

 

posted @ 2019-03-10 17:17  yorkmass  阅读(1439)  评论(0)    收藏  举报