欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XML的SAX解析

程序员文章站 2022-06-16 12:13:28
...

SAX是一个顺序执行,事件驱动的解析方法(事件驱动,简单地说就是你点什么按钮(即产生什么事件))

 

SAX的工作原理;

     

1.在文档的开始和结束时触发文档处理事件。
2.在文档内每一XML元素接受解析的前后触发元素事件。
3.任何元数据通常由单独的事件处理
4.在处理文档的DTD或Schema时产生DTD或Schema事件。
5.产生错误事件用来通知主机应用程序解析错误。
 
XML的SAX解析
 
DOM解析博客地址连接:DOM解析
SAX与DOM解析的优点;SAX解析适合较大的XML文件解析,DOM可以增加节点
 
SAX解析的主要方法;
1,创建解析工厂实例
2,创建解析工厂
3,解析xml
 startElement() 回调在每次 SAX 解析器遇到元素的起始标记时被调用
characters() 回调为字符数据所调用
endElement() 为元素的结束标记所调用
DefaultHandler类
 
JAVA解析xml文档;
XML的SAX解析
 代码如下
package SAX解析;

import java.util.ArrayList;
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;

/**
 * SAX解析 1.创建解析工厂
 *  2,创建解析工厂实例 
 *  3,工厂实例来解析XML(本地文件,文件解析器)
 * 
 * @author Administrator
 */
public class SAXDemo {
	ArrayList<Student> list;
	Student stu;
	String strValue;

	public static void main(String[] args) throws Exception {
		SAXDemo demo = new SAXDemo();
		demo.sefa();

	}

	public void sefa() throws Exception {
		//开始时间
		long l1=System.currentTimeMillis();
		// 创建工厂实例
		SAXParserFactory factory = SAXParserFactory.newInstance();
		// 创建解析工厂
		SAXParser parser = factory.newSAXParser();
		String f = "C:\\Users\\Administrator\\Desktop\\xml\\student2.xml";
		MyDefaultHandler hb = new MyDefaultHandler();
		// 解析XML
		parser.parse(f, hb);
		long l2= System.currentTimeMillis();
		long end =l2-l1;
		//1818ms
		System.out.println("解析时间:"+end+"ms");
	}

	/**
	 * 创建外部类,解析XML startDocument开始读取文本 startElement开始读取元素
	 */

	class MyDefaultHandler extends DefaultHandler {
		// 开始读取文本
		public void startDocument() throws SAXException {
			System.out.println("开始解析..");
			list = new ArrayList<Student>();
		}
		// 结束文本读取
		public void endDocument() throws SAXException {
			// 遍历队列
			for (Student strs : list) {
				System.out.println(strs);
			}
			System.out.println("解析完成..");
		}

		// 开始读取元素
		public void startElement(String uri, String localName, String qName,
				Attributes attr) throws SAXException {
			if (qName.equals("stu")) {
				stu = new Student();
				list.add(stu);
				String nums = attr.getValue("num");
				String nos = attr.getValue("no");
				if (nums != null) {
					 stu.num = Integer.parseInt(nums);
				}
				if (nos != null) {
					stu.no = Integer.parseInt(nos);
				}

			}
		}

		// 结束元素的读取
		public void endElement(String uri, String localName, String qName)
				throws SAXException {

			if (qName.equals("name")) {
				stu.name = strValue;
			}
			if (qName.equals("sex")) {
				stu.sex = strValue;
			}
			if (qName.equals("cla")) {
				stu.cla = strValue;
			}
		}

		// 读取字符串
		public void characters(char ch[], int start, int length)
				throws SAXException {
			// 创建字符串
			strValue = new String(ch, start, length);
		}

	
	}

}