.在使用DOM解析XML文檔時,需要讀取整個XML文檔,在內存中構架代表整個DOM樹的Document對象,
從而再對XML文檔進行操作。此種情況,如果XML文檔特別大,就會消耗計算機的大量內存,並且容易導致內存溢出。
.SAX解析允許在讀取文檔時,即對文檔進行處理,而不必等到整個文檔裝載完纔會對文檔進行操作。
.SAX 採用事件處理的方式解析XML文件,涉及兩個部分:解析器和事件處理器
- .解析器可以使用JAXP的API創建,創建出SAX解析器後,就可以指定解析器去解析某個XML文檔
- .解析器採用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會 把當前 解析到的XML文件內容作爲方法的參數傳遞給時間處理器
- 事件處理器有程序員編寫,程序員通過事件處理器中方法的參數,就可以很輕鬆地得到SAX解析器解析到的數據,從而可以決定如何對數據進行處理
舉例:book.xml
<?xml version="1.0" encoding="UTF-8" ?>
<書架>
<書>
<書名 name = "xxxx ">java 就業培訓教程</書名>
<作者>張孝祥</作者>
<售價>109元</售價>
<售價>39.00元</售價>
</書>
<書>
<書名 >JavaScript網頁製作</書名>
<作者>韓順平</作者>
<售價>28.00元</售價>
</書>
</書架>
//1.創建解析工廠
SAXParserFactory factory = SAXParserFactory .newInstance();
//2.得到解釋器
SAXParser sp = factory.newSAXParser();
//3.得到讀取器
XMLReader reader = sp.getXMLReader();
//4.設置內容處理器
reader.setContentHandler(new ListHandler());
//5.讀取xml文檔內容
reader.parser("src/book.xml")
//得到xml文檔中所有內容
class ListHandler implements ContentHandler(
public void startElement(String url,String localName,String name,Attributes atts)
throws SAXException(
System.out.println("<"+name+">")
//取屬性
for ( int i=0; atts != null && i<atts.getLength();i++ )(
String attName = atts.getQName(i);
String attValue = atts.getValue(i);
System.out.println(attName + "="+attValue );
)
)
public void characters(char[] ch,int start,intlength)
throws SAXException(
System.out.println(new String(ch,start,lengh));
)
public void endElement(String url,String localName,String name)
throws SAXException(
System.out.println("</"+name+">")
)
)
// 獲取指定標籤的內容
//1.創建解析工廠
SAXParserFactory factory = SAXParserFactory .newInstance();
//2.得到解釋器
SAXParser sp = factory.newSAXParser();
//3.得到讀取器
XMLReader reader = sp.getXMLReader();
//4.設置內容處理器
reader.setContentHandler(new TagValueHandler ());
//5.讀取xml文檔內容
reader.parser("src/book.xml")
class TagValueHandler extends DefaultHandler(
private String currentTag;//記住當前解析的是什麼標籤
private int needNumber =2;//記住想獲取第幾個作者標籤的值
private int currentNumber;//當前解析到的第幾個作者標籤
public void startElement(String url,String localName,String name,Attributes atts)
throws SAXException(
currentTag =name;
if(currentTag .equals("作者"))(
currentNumber++;
)
)
)
public void characters(char[] ch,int start,intlength)
throws SAXException(
if ("作者".equals(currentTag) && currentNumber ==needNumber )(
System.out.println(new String(ch,start,length))
)
)
public void endElement(String url,String localName,String name)
throws SAXException(
currentTag = null;
)
)
打印結果:韓順平