sax解析
SAX 解析 1. SAX ( Simple Application interface for XML ), 是一組程序設計接口,采用 observer 模式,將XML文件視為一個文字流的數據,在讀取XML 元素時觸發一系列的事件
2. 使用DOM 時是將xml 文件解析為一個樹狀結構,并對樹中的節點進行操作
使用SAX 加載XML文件時,他的操作像打開一個“順序的文件字符流”,在讀到XML元素的開始標記,結尾標記和內容標記時將產生一系列的事件
如一個簡單的XML文件:<hello><message>hello XML!</message></hello>
會相應的觸發:startDocument, startElement, characters, endElement, endDocument, 只需編寫這些事件處理程序就可以解析XML文件了
3. SAX 可以高效的使用內存,因為SAX 只是順序的讀取XML 文件的內容,并不會將XML 文件完全加載,這樣就比DOM 的處理效率高
但SAX 只能讀取XML 文件的內容,而不能更改XML 的內容,也不能隨機訪問XML 元素?
4. 在SAX 中有4個處理器是要實現的:ContentHandler,DTDHandler,EntityResolver,ErrorHandler,以處理不同的事件,這是比較麻煩的,
幸好SAX 定義了一個 DefaultHandler 類把這幾個實現了,我們只需在 DefaultHandler中定義事件處理方法,然后注冊到XMLReader,而SAXParser封裝了XMLReader的實現類,
SAXParser又是由SAXParserFactory提供的,所以我們實際用到的類只有:SAXParserFactory,SAXParser,DefaultHandler
5. SAX 的解析步驟:
(1)寫一個類繼承 DefaultHandler, 實現自己的事件處理方法
(2)在主程序中建立 SAXParserFactory
(3)可以設置這個factory 的參數
(4)從這個factory 得到SAXParser
(5)解析XML文件
例子:
XML 文件:hr.xml
<?xml version="1.0"?encoding="GB2312"??>?
<!-- 個人履歷表-->?
<resume>
<person id="01">
<name>張三</name>?
<birthday>03/24/1975</birthday>?
<phone>1111-1111</phone>?
<address>大連</address>
</person>?
<person id="02">
<name>李四</name>?
<birthday>9/26/1978</birthday>?
<phone>2222-2222</phone>?
<address>南京</address>
</person>?
<person id="03">
<name>王五</name>?
<birthday>11/09/1979</birthday>?
<phone>3333-3333</phone>?
<address>武漢</address>
</person>
</resume>?
import?javax.xml.parsers.*;
import?org.xml.sax.*;
import?org.xml.sax.helpers.*;
public?class?MySaxParser?extends?DefaultHandler {
public?static?void?main(?String[] args ){
try{
// 創建一個handler
DefaultHandler dh =?new?MySaxParser();
// 創建SAXParserFactory
SAXParserFactory spf = SAXParserFactory.newInstance();
// 從factory 中得到SAXParser
SAXParser sp = spf.newSAXParser();
// 用自定義的handler 解析xml
sp.parse(?"08_02.xml", dh );
}catch( Exception e ){
e.printStackTrace();
}
}
public?void?startDocument(){
}
/**
* 當開始一個元素時打印出元素名和此元素的所有屬性
*/
public?void?startElement(String?uri,
String?localName,
String?qName,
Attributes attributes)
{
System.out.print( qName +?":"?);?
int?len = 0;
len = attributes.getLength();
if( len > 0 ){
System.out.print(?"\t"?+?"attributes: "?);
for(?int?i=0; i<len; i++ )
System.out.print( attributes.getQName(i) +?"="?+ attributes.getValue(i) +?"\t"?);
//System.out.println();?
}?
}
/**
* 打印出元素內容
*/
public?void?characters(char[] ch,
int?start,
int?length)
{
String?s =?String.valueOf( ch, start, length );
System.out.print( s );
}
public?void?endElement(String?uri,
String?localName,
String?qName)
{
}
public?void?endDocument(){
}
} 本文轉自kenty博客園博客,原文鏈接 http://www.cnblogs.com/kentyshang/archive/2007/01/04/611204.html如需轉載請自行聯系原作者
kenty
總結
- 上一篇: Windows Server 2016
- 下一篇: 通用权限管理系统组件 (GPM - Ge