用sax方式解析xml

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繼承的)!我們的用法就是爲了少去覆蓋方法!

好吧還有一點注意的是我們的方法:就是面向對象!把每一個元素打包爲方法!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章