sax的全名爲Simple api for xml 。所以相比於dom的不同點就是:dom解析需要讀取所有文檔內容,把所有的文檔加載到內存中去。所以其在pc上還可以使用,但是在手機上這些就需要sax了,sax是一點一點的讀取並且處理。所以這也是這兩者 的區別,還有一點就是:sax解析是擅長讀取,而你想要增刪的話要用dom吧。
sax的讀取還是和dom差不多的,你可以創建一個工廠:
try {
//創建一個抽象工廠類
SAXParserFactory spf = SAXParserFactory.newInstance();
//獲得一個解析器
SAXParser sp = spf.newSAXParser();
//獲得一個讀取器
XMLReader xp = sp.getXMLReader();
//設置它的內容處理器
xp.setContentHandler(new myHandler());
//讀取xml文檔
xp.parse("src/book.xml");
}
catch (Exception e) {
throw new RuntimeException(e);
}
我們依舊是爲了讀取一個book.xml文檔來處理:
那麼我們可以去建一個handler來繼承一個ContentHandler接口!來實現我們的東西。
class myHandler implements ContentHandler
{
//這個方法就是當你在讀取到一個標籤式調用,打印qName也能看的出來!
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
System.out.println("<"+qName+">");
}
//標籤中的內容讀取的時候會調用這個方法,ch中就是內容數組!
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
//當標籤結束的時候會調用這個方法!
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("</"+qName+">");
}
.......
}
也就是說這是一個內容處理器就好比一個代理一樣,當讀取什麼的時候,就調用哪個方法!
也就是說我們可以有很多方法調用啊!但是我們不都要 覆蓋那麼我們可以繼承DefaultHandler來解決這一問題!
我們再來一種開發常用的方法來讀取xml文件:也就是說要把xml中的打包爲一個對象!也可以是bean!
package Web4Xml;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class mySax4Xml2 {
/**
* @param args
*/
public static void main(String[] args) {
createSax();
}
public static void createSax()
{
try {
//創建一個抽象工廠類
SAXParserFactory spf = SAXParserFactory.newInstance();
//獲得一個解析器
SAXParser sp = spf.newSAXParser();
//獲得一個讀取器
XMLReader xp = sp.getXMLReader();
Handle myhand = new Handle();
//設置它的內容處理器
xp.setContentHandler(myhand);
//讀取xml文檔
xp.parse("src/book.xml");
List<book> list = myhand.getBook();
for(ListIterator<book> it = list.listIterator();it.hasNext();)
{
book b= it.next();
System.out.println(b.getName()+"價格是:"+b.getPrice());
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
}
class book
{
private String name ;
private String price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
class Handle extends DefaultHandler
{
private List<book> booklist = new ArrayList<book>();
private String currentTag;
book mybook = null;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag = qName;
if(qName.equals("book"))
{
mybook = new book();
booklist.add(mybook);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String str = new String(ch,start,length);
if("bookname".equals(currentTag))
{
mybook.setName(str);
}
if("bookprice".equals(currentTag))
{
mybook.setPrice(str);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentTag = null;
if(qName.equals("book"))
{
mybook = null;
}
}
public List<book> getBook()
{
return booklist;
}
}
文中最關鍵是我們沒有直接繼承ContentHandler接口而是直接去繼承了DefaultHandler(用extends繼承的)!我們的用法就是爲了少去覆蓋方法!
好吧還有一點注意的是我們的方法:就是面向對象!把每一個元素打包爲方法!