上节大概举例实现了dom解析,这节来看看sax解析
SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOM解析,PULL解析(Android特有),SAX与DOM不同的是它边扫描边解析,自顶向下依次解析,由于边扫描边解析,所以它解析XML具有速度快,占用内存少的优点,对于Android等CPU资源宝贵的移动平台来说是一个巨大的优势。
SAX的优点:
1.解析速度快
2.占用内存少
SAX的缺点:
1.无法知道当前解析标签(节点)的上层标签,及其嵌套结构,仅仅知道当前解析的标签的名字和属性,要知道其他信息需要程序猿自己编码
2.只能读取XML,无法修改XML
3.无法随机访问某个标签(节点)
SAX解析适用场合
4.对于CPU资源宝贵的设备,如Android等移动设备
5.对于只需从xml读取信息而无需修改xml
下面是简单的代码实现:
package xml;
import java.io.IOException;
import java.util.ArrayList;
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;
public class SaxParser {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//1.创建解析工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//2.创建解析器
SAXParser parser=factory.newSAXParser();
//3.解析文档,传入xml文件和自己设计的处理器
parser.parse("resource/Demo1.xml", new Myhandler());
for (int i = 0; i < Myhandler.alist.size(); i++) {
System.out.println(Myhandler.alist.get(i));
}
}
}
class Myhandler extends DefaultHandler{
/**
* 创建集合,存储数据,这里我们要解析的是xml文件里面书的相关信息,所以要另外建一个类Book
* 提供get和set方法
* 在Myhandler这个类中有许多可以重写的方法,这里简单列出三个主要的
* 其他的可以等有机会我再总结,有兴趣可以自己看看
*
*/
static ArrayList<Book> alist=new ArrayList<Book>();
Book book;
String qname;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
this.qname=qName;
if("book".equals(qName)){
book=new Book();
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("title".equals(qname)){
book.setTitle(new String(ch,start,length));
}else if("author".equals(qname)){
book.setAuthor(new String(ch,start,length));
}else if("year".equals(qname)){
book.setYear(new String(ch,start,length));
}else if("price".equals(qname)){
book.setPrice(new String(ch,start,length));
}else if("category".equals(qname)){
book.setCategory(new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
this.qname=null;
if("book".equals(qName)){
alist.add(book);
}
}
/*@Override
public void startDocument() throws SAXException {
System.out.println("文档解析开始啦");
}
//这两个方法的结果和我预想的不太一样,先注释掉。。。
@Override
public void endDocument() throws SAXException {
System.out.println("文档解析结束");
}*/
}
//======这是新建的book类,辅助测试
package xml;
public class Book {
String title;
String author;
String year;
String price;
String category;
public Book(){
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public Book(String title, String author, String year, String price,
String category) {
super();
this.title = title;
this.author = author;
this.year = year;
this.price = price;
this.category = category;
}
@Override
public String toString() {
return "Book [title=" + title + ", author=" + author + ", year=" + year
+ ", price=" + price + ", category=" + category + "]";
}
}