用Java結合SAX 2.0 解析XML文件 (轉)
/*
自從真正形成以來(我認為是Org.組織釋出XML標準時開始),XML得到了很快的發展,
很多廠商都有推出了自己的XML解析器,如的xalan,IBM的xerces,sun的J等,不過這些都是在
基於JAXP( for XML processing)的,從 1.4.0開始的後續j2sdk裡都附加了JAXP,這給開發人員
帶來了很大的方便,這使得我們在處理一般的XML功能上的問題時不再需要去用第三方的XML了.
隨著XML的迅速發展,SAX也從1.0到了現在的2.0了(還是能夠和1.0相容),結構上有了一些較大的變化.
DOM(document model)每次讀取XML節點時都要把它load到裡來,在文件很大時,就顯得很慢了,SAX(simple API for XML),是一個XML解析器的介面,它比DOM更低階一些,它是一種基於事件和回撥的XML處理方式, 因此在解析速度上DOM是沒法比的(當要解析的XML文件很大的時更是如此).那麼在SAX中事件響應(event)是什麼呢 ? 我個人認為這一點和,AWT中的事件義有點相似的,都有是指在觸發某些特定的行為時所做的處理,如:mouse 的click事件等到. 這裡則是指碰到特定的XML節點的所做的處理,如文件開始(startDocument),文件結束(endDocument),元素開始(startElement)等很多,大家看一下SAX的API中的方法名字就知道有哪些事件了,基本上可以做到見文知義的.在只想分析XML內容(只讀),要求高,靈活性 能夠定位錯誤資訊(SAX能夠定位錯誤的行列位置)時,最好用SAX來做. 一般情況下SAX是按下面的原理去使用的:
<1>設定事件處理器(SAX 1.0是使用一個透過繼承HandlerBase類的例項來設定的,SAX 2.0則是繼承DefaultHandler的,還有用XMLReader方式的,在原理上沒有很大的區別)
<2>載入要解析的內容
<3>在需要解析的事件方法裡(具體參見SAX API文件)加入自己的控制邏輯.
<4>重複<3>直到解析完為止.
在這裡我自己寫了一個描述電影海報資訊的XML(file.xml),用SAX2.0寫了一個很簡單的XML內容閱讀器來解析它, 和大家交流一下自己的心得.在我的機器上經過了測試的(OS: Advanced Server(English version),
pentium , 256M RAM)
*/
import org.w3c.dom.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
class MyXMLReader extends DefaultHandler
{
//Fields
private int index;
private Locator locator;
//Constructor
public MyXMLReader(){
super(); //it must be done !
}
//nain method
public static void main(String[] args){
try{
SAXParserFactory = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new Input("film.xml"),reader);
}
catch(Exception e){
e.printStackTrace();
}
}
//Response the startDocument event
public void startDocument() {
System.out.println("n********************************* (: 元旦電影海報 :) ***********************************n");
}
//Response the startElement event
public void startElement(String uri, String localName, String qName, Attributes attrs){
if( qName.equalsIgnoreCase("film") ){
index ++;
int attrCount = attrs.getLength();
for( int i = 0; i < attrCount; i ++ ){
String attrName = attrs.getQName(i);
if( attrName.equalsIgnoreCase("name") ){
System.out.println("t第" + index + "場,片名:<>");
}
if( attrName.equalsIgnoreCase("price") ){
System.out.println("t票價:" + attrs.getValue(i) );
}
if( attrName.equalsIgnoreCase("station") ){
System.out.println("t放映地點:" + attrs.getValue(i) );
}
if( attrName.equalsIgnoreCase("time") ){
System.out.println("t放映時間:" + attrs.getValue(i) );
}
if( attrName.equalsIgnoreCase("describtion") ){
System.out.println("t影片簡介:" + attrs.getValue(i) );
}
System.out.println();
}
}
//Response the endDocument event
public void endDocument(){
System.out.println("ttttttt------ 共有" + index + "場電影要放映");
}
//Response the endElement event
public void endElement(String uri, String localName, String qName){
//add your codes if neccessary ...
}
//Print the a error information
public void fatalError(SAXParseException e){
System.out.println("nFatal error information -->");
System.out.println("t" + e.getMessage());
System.out.println("tAt line " + locator.getLineNumber() +
",column " + locator.getColumnNumber());
}
//Print the usual error information
public void error(SAXParseException e){
System.out.println("nUsual error information -->");
System.out.println("t" + e.getMessage());
System.out.println("tAt line " + locator.getLineNumber() +
",column " + locator.getColumnNumber());
}
//Print the warning information
public void warning(SAXParseException e){
System.out.println("nWarning information -->");
System.out.println("t" + e.getMessage());
System.out.println("tAt line " + locator.getLineNumber() +
",column " + locator.getColumnNumber());
}
//Store the error locator object
public void setDocumentLocator(Locator lct){
locator = lct;
}
}//End class MyXMLReader
附: film.xml完全的內容:
<!-- 年元月1號長沙市各大影院落放映列表 -->
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998442/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java使用sax解析xmlJavaXML
- JAVA-使用SAX解析XML資料JavaXML
- XML解析-最快的方式SAXXML
- python使用SAX解析xmlPythonXML
- Java中Dom解析xml文件JavaXML
- [轉]使用 SAX 處理 XML 文件 和與DOM的區別XML
- Android系列--DOM、SAX、Pull解析XMLAndroidXML
- python 解析xml 檔案: SAX方式PythonXML
- Python解析xml大檔案(sax)PythonXML
- Java解析XML彙總(DOM/SAX/JDOM/DOM4j/XPath)JavaXML
- XML解析的兩種方式DOM和SAXXML
- 使用Digester解析XML文件示例 (轉)XML
- 關於SAX解析xml檔案的問題XML
- 用JDOM處理XML文件 (轉)XML
- XML的JAVA 解析(一)(1) (轉)XMLJava
- XML的JAVA 解析(一)(3) (轉)XMLJava
- XML的JAVA 解析(一)(2) (轉)XMLJava
- XML的JAVA 解析(一)(4) (轉)XMLJava
- XML的JAVA 解析(一)(5) (轉)XMLJava
- :Android網路程式設計--XML之解析方式:SAXAndroid程式設計XML
- XML與HTML的結合(下)(轉)XMLHTML
- DOM解析和SAX解析
- 【Java】解析xmlJavaXML
- Java解析XMLJavaXML
- SAX處理XML例項XML
- sax解析例子演示
- jaxp的sax解析操作
- Delphi6/7 中XML 文件的應用 (轉)XML
- XML與CSS結合XMLCSS
- JAVA進行XML解析JavaXML
- dom解析和sax解析的區別
- 使用JAXP進行DOM解析_SAX解析
- SAX解析XML檔案有關characters的最大長度2048的問題XML
- Sax 解析xml檔案時, 資料資訊不完整問題解決方法XML
- C# 讀取XML文件 (轉)C#XML
- JSP結合XML XSLT將輸出轉換HTML(轉)JSXMLHTML
- 使用 Java 解析XML檔案JavaXML
- org.xml.sax.SAXParseException: XML 宣告可能只能從實體開始。XMLException