Sax解析机制
Sax 的全称为Simple APIs for XML ,也即XML简单运用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列的事件,并激活相应的事件处理函数,应用程序通过对这些事件处理函数实现对XML文档的访问,因而SAX 接口也被称作事件驱动接口。
Sax分析器在实现时,它只是顺序地检查XML文档中的字节流,判断当前字节是XML语法中的哪一部分,是否符合XML语法,然后再触发相应的事件,而事件处理函数本身则要由应用程序自己来实现。同DOM分析器相比,SAX分析器缺乏灵活性。然而,由于SAX分析器实现简单,对内存的要求比较低,因此实现的效率比较高,对于那些只需要访问XML文档中的数据而不对XML文档进行更改的应用程序来说,Sax分析器更为合适。常用的SAX 处理事件
startDocument() : 告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档
endDoucument():告诉你解析器发现了文档尾
startElement():告诉你解析器发现了一个起始标签,该事件告诉你元素的名称,该元素的名称,该元素所有的属性名和值
character():告诉你解析器发现了一些文本,将得到一个字符数组,该数组的偏移量和一个长度变量,有这三个变量你可以得到解析器所发现的文本
endElement():告诉你解析器发现了一个结束标签,该事件告诉你元素的名称
3. Java中使用SAX技术解析XML文档的具体实现
package com.ywendeng.java.demo2;
import java.io.File;
import java.util.Stack;
import javax.xml.parsers.ParserConfigurationException;
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来解析xml文档
*/
public class Sax {
public static void main(String[] args) throws Exception, SAXException {
//1.获得SAX解析器工厂实例
SAXParserFactory factory=SAXParserFactory.newInstance();
//2.获得sax 解析器实例
SAXParser parser=factory.newSAXParser();
//3.开始进行解析
parser.parse(new File("xml15.xml"), new MyHandler());
}
}
class MyHandler extends DefaultHandler{
private Stack<String> stack=new Stack<String>();
private String name;
private String gender;
private String age;
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
stack.push(qName);
for(int i=0;i<attributes.getLength();i++){
String attrName=attributes.getQName(i);
String attrValue=attributes.getValue(i);
System.out.println(attrName+" ="+attrValue);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String tag=stack.peek();
if("姓名".equals(tag)){
name=new String(ch,start,length);
}
else if("性别".equals(tag)){
gender=new String(ch,start,length);
}else if("年龄".equals(tag)){
age=new String(ch,start,length);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
stack.pop();//表示该元素已经用完
if("学生".equals(qName)){
System.out.println("姓名:" + name);
System.out.println("性别:" + gender);
System.out.println("年龄:" + age);
System.out.println();
}
}
}