Java之sax解析


簡介:

事件驅動,邊讀邊解析

NO.

SAXParser

作用

SAXParserFactory

作用

1

public abstract class SAXParser extends Object
繼承關系
public abstract class SAXParserFactory extends Object
繼承關系

2

 
public void parse(File f,DefaultHandler dh) throws SAXException,IOException

解析使用指定的指定XML文件的內容DefaultHandler 

f - 包含要解析的XML的文件

dh - 要使用的SAX DefaultHandler。

當傳入事件處理器,相當於在方法里面綁定了一個事件(自動執行事件)

public static SAXParserFactory newInstance()
創建 SAXParserFactory實例

3

   
public abstract SAXParser newSAXParser()throws ParserConfigurationException,SAXException
創建SAXParse實例

 NO

DefaultHandler (事件處理器)

參數

 作用

1

public class DefaultHandler extends Object implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler
  繼承這個類然后重寫下面三個方法

2

 
public void characters(char[] ch,int start,int length)throws SAXException

ch - 字符。

start - 字符數組中的起始位置。

length - 從字符數組中使用的字符數。

 接收元素內的字符數據通知。

默認情況下,什么也不做。 應用程序編寫者可以覆蓋此方法以對每個字符數據塊采取特定操作(例如將數據添加到節點或緩沖區,或將其打印到文件中)。

3

public void startElement(String uri,String localName,String qName,Attributes attributes)throws SAXException

 uri - 命名空間URI,如果該元素沒有命名空間URI或未執行命名空間處理,則為空字符串。

localName - 本地名稱(無前綴),或空字符串,如果未執行命名空間處理。

qName - 限定名稱(帶前綴),如果限定名稱不可用,則為空字符串。

attributes - 附加到元素的屬性。 如果沒有屬性,它將是一個空的Attributes對象。

 接收元素開始的通知。

默認情況下,什么也不做。 應用程序編寫者可以在子類中覆蓋此方法,以在每個元素的開始處采取特定的操作(例如分配新的樹節點或將輸出寫入文件)。

4

 
public void endElement(String uri,String localName,String qName)throws SAXException
 

uri - 名稱空間URI,或空字符串,如果該元素沒有命名空間URI或未命名空間處理。


localName - 本地名稱(無前綴),或空字符串,如果未執行命名空間處理。


qName - 限定名稱(帶前綴),如果限定名稱不可用,則為空字符串。

 

接收元素結尾的通知。
默認情況下,什么也不做。 應用程序編寫者可以在子類中覆蓋此方法,以在每個元素的末尾執行特定操作(例如,完成樹節點或將輸出寫入文件)。

 代碼實現:

package SAX.cn;

import java.io.File;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class TestSax {
    public static void main(String[] args) throws Exception {
        /**
         * 1、創建一個解析器工廠
         * 2、創建解析器
         * 3、執行parse()方法
         */
        // 創建解析器工廠
        SAXParserFactory spf = SAXParserFactory.newInstance();
        // 創建解析器
        SAXParser sax = spf.newSAXParser();
        // 執行parse()方法
        sax.parse("src" + File.separator + "SAX" + File.separator + "cn" + File.separator + "saxDemo.xml",new MyDef());
        // 執行parse()方法后會自動執行事件處理器中的方法
        
    }
}
class MyDef extends DefaultHandler{
    
    /**
     * 開始標簽
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.print("<" + qName + ">");
    }
    
    /**
     * 文本內容
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        System.out.print(new String(ch,start,length));
    }
    
    /**
     * 結束標簽
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.print("</" + qName + ">");
    }
}

輸出結果:

 

 

import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class TestSax { public static void main(String[] args) throws Exception { /** * 1、創建一個解析器工廠 2、創建解析器 3、執行parse()方法 */
        // 創建解析器工廠
        SAXParserFactory spf = SAXParserFactory.newInstance(); // 創建解析器
        SAXParser sax = spf.newSAXParser(); // 執行parse()方法
        sax.parse("src" + File.separator + "SAX" + File.separator + "cn" + File.separator + "saxDemo.xml", new MyDef2()); // 執行parse()方法后會自動執行事件處理器中的方法
 } } // 獲取所有name標簽的值
class MyDef2 extends DefaultHandler { boolean flag = false;    // 相當於是倉庫鑰匙,startElement()是進門和endElement()就是出門,flag=true就是用鑰匙開門,flag=false就是關門,characters()就是在進出倉庫拿內容
 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 判斷qName是否是name標簽
        if ("name".equals(qName)) { flag = true;    // 找到name標簽則flag為true
 } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flag == true) {    // flag為true表示已經找到name標簽
            System.out.println("name:" + new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(flag == true) {    // 已經找到name的開始標簽並打印了內容,那么此次那么標簽應該結束
            flag = false; } } } }

上面的代碼實現了獲取name標簽的值(使用"name".equals(qName)來控制):

package SAX.cn; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class TestSax { public static void main(String[] args) throws Exception { /** * 1、創建一個解析器工廠 2、創建解析器 3、執行parse()方法 */
        // 創建解析器工廠
        SAXParserFactory spf = SAXParserFactory.newInstance(); // 創建解析器
        SAXParser sax = spf.newSAXParser(); // 執行parse()方法
        sax.parse("src" + File.separator + "SAX" + File.separator + "cn" + File.separator + "saxDemo.xml", new MyDef2()); // 執行parse()方法后會自動執行事件處理器中的方法
 } } // 獲取所有name標簽的值
class MyDef2 extends DefaultHandler { boolean flag = false;    // 相當於是倉庫鑰匙,startElement()是進門和endElement()就是出門,flag=true就是用鑰匙開門,flag=false就是關門,characters()就是在進出倉庫拿內容
    int index = 1; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 判斷qName是否是name標簽
        if ("name".equals(qName) && index==1) { flag = true;    // 找到name標簽則flag為true
 } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flag == true) {    // flag為true表示已經找到name標簽
            System.out.println("name:" + new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(flag == true) {    // 已經找到name的開始標簽並打印了內容,那么此次那么標簽應該結束
            flag = false; index++; } } }

上面的代碼實現了獲取第一個name標簽的值(使用index來控制):

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM