SAX解析XML

DOM和SAX解析的區別:

由於DOM方式在解析文檔時,需要首先將整個XML 文檔裝載進內存,如果文檔特別大,就會消耗計算機的大量內存,甚至導致內存溢出。

Sax方式在解析xml時無需加載整個文檔
它允許解析器在讀取文檔的同時就對文檔進行處理,而不必等到整個文檔裝載完纔會文檔進行操作。

Sax是以事件處理的方式對xml文檔進行解析的,主要有兩個核心對象: 解析器對象 和 處理器對象

解析器負責對文檔進行解析,當解析到xml文檔的某個組成部分,就會根據類型調用處理器對象相對應方法

EntityResolver, DTDHandler, ContentHandler, ErrorHandler這四個是接口!當觸發什麼事件就會調用相對應 的觸發器!


使用SAXParserFactory創建SAX解析工廠
SAXParserFactory spf = SAXParserFactory.newInstance();
通過SAX解析工廠得到解析器對象
SAXParser sp = spf.newSAXParser();
通過解析器對象得到一個XML的讀取器
XMLReader xmlReader = sp.getXMLReader();
設置讀取器的事件處理器
xmlReader.setContentHandler(new BookParserHandler());
解析xml文件
xmlReader.parse("book.xml");


/**sax解析
* @throws Exception 
* @throws ParserConfigurationException 
*/
public static void main(String[] args) throws ParserConfigurationException, Exception {

//1.得到sax解析工廠
SAXParserFactory factory = SAXParserFactory.newInstance();

//2.得到sax解析器
SAXParser parser = factory.newSAXParser();

//3.得到xml讀取器
XMLReader reader = parser.getXMLReader();

//4.注入事件處理器
reader.setContentHandler(new MyContentHandler1());


//5.開始解析xml文檔
reader.parse("src/book.xml");
}



//獲取整個xml文檔的內容
class MyContentHandler implements ContentHandler{


        // 解析到文檔開始標籤時調用,name—標籤名
public void startElement(String uri, String localName, String name,
Attributes atts) throws SAXException {
System.out.println("<" +  name + ">");
for(int i=0;i<atts.getLength();i++){
String attName = atts.getQName(i);
String attValue = atts.getValue(i);
System.out.println(attName + "=" + attValue);
}
}

       //  解析到結束標籤時調用,name標籤名
public void endElement(String uri, String localName, String name)
throws SAXException {

System.out.println("</" + name + ">");


}

         // 解析到內容時調用,會將內容放在一個字符數組裏傳給這個方法,並告訴我們解析的內容會放在字符數組 的什麼位置。
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}


public void endDocument() throws SAXException {
// TODO Auto-generated method stub
}


public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub
}


public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub

}


public void processingInstruction(String target, String data)
throws SAXException {
// TODO Auto-generated method stub

}


public void setDocumentLocator(Locator locator) {
// TODO Auto-generated method stub

}


public void skippedEntity(String name) throws SAXException {
// TODO Auto-generated method stub

}


public void startDocument() throws SAXException {
// TODO Auto-generated method stub

}




public void startPrefixMapping(String prefix, String uri)
throws SAXException {
// TODO Auto-generated method stub

}
}



發佈了24 篇原創文章 · 獲贊 75 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章