SAX是什么
SAX是一种快速读写XML数据的方式。
局限
1.SAX分析器在解析xml文档时,触发了一系列事件,因为事件本身是有时序性的。因此SAX一旦经过了某个元素,没有办法返回再去访问。
2.SAX分析器只事检查xml文档中的字节流,语法,然后触发相应事件。而处理函数本身则要由程序实现,相比DOM,SAX缺乏灵活性。
优势
SAX分析器实现简单,对内存要求比较低,因此实现小路比较高;对于大型的xml文档来说,通常会用SAX而不用DOM;对于那些只需要访问xml文档中的数据而不对文档进行更改的应用程序来说,SAX分析器更为合适。
SAX实例解析
Juny Of CityJuny
2011
15.99
Harry PotterJ K. Rowling
2005
29.99
解析过程
package sax;
import java.io.File;
import java.util.Stack;
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 SaxTest2 {
public static void main(String[] args) throws Exception {
// step 1: 获得SAX解析器工厂实例
SAXParserFactory factory = SAXParserFactory.newInstance();
// step 2: 获得SAX解析器的实例
SAXParser parser = factory.newSAXParser();
// step 3: 开始进行解析
// 传入待解析的文档的处理器
parser.parse(new File("books.xml"),new MySAXHandler());
}
}
class MySAXHandler extends DefaultHandler {
// 使用栈这个数据结构来保存
private Stack stack = new Stack();
// 数据
private String title;
private String author;
private String year;
private double price;
@Override
public void startDocument() throws SAXException {
System.out.println("start document-> parse begin");
}
@Override
public void endDocument() throws SAXException {
System.out.println("end document-> parse finished");
}
@Override
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 ("title".equals(tag)) {
title = new String(ch, start, length);
} else if ("author".equals(tag)) {
author = new String(ch, start, length);
} else if ("year".equals(tag)) {
year = new String(ch, start, length);
} else if ("price".equals(tag)) {
price = Double.parseDouble(new String(ch, start, length));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
stack.pop();//表示该元素解析完毕,需要从栈中弹出标签
if("book".equals(qName)){
System.out.println("Book info: -------");
System.out.println(" title: " + title);
System.out.println(" author: " + author);
System.out.println(" year: " + year);
System.out.println(" price: " + price);
System.out.println();
}
}
}
## 控制台输出 ##
start document-> parse begin
属性:category:man
属性:lang:en
Book info: -------
title: Juny Of City
author: Juny
year: 2011
price: 15.99
属性:category:children
属性:lang:en
Book info: -------
title: Harry Potter
author: J K. Rowling
year: 2005
price: 29.99
end document-> parse finished