上節大概舉例實現了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 + "]";
}
}