欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中使用sax解析xml的解決方法

 更新時(shí)間:2013年05月03日 14:49:23   作者:  
本篇文章介紹了,在java中使用sax解析xml的解決方法。需要的朋友參考下

在java中,原生解析xml文檔的方式有兩種,分別是:Dom解析和Sax解析

Dom解析功能強(qiáng)大,可增刪改查,操作時(shí)會(huì)將xml文檔以文檔對(duì)象的方式讀取到內(nèi)存中,因此適用于小文檔

Sax解析是從頭到尾逐行逐個(gè)元素讀取內(nèi)容,修改較為不便,但適用于只讀的大文檔

本文主要講解Sax解析,其余放在后面

Sax采用事件驅(qū)動(dòng)的方式解析文檔。簡單點(diǎn)說,如同在電影院看電影一樣,從頭到尾看一遍就完了,不能回退(Dom可來來回回讀?。?/P>

在看電影的過程中,每遇到一個(gè)情節(jié),一段淚水,一次擦肩,你都會(huì)調(diào)動(dòng)大腦和神經(jīng)去接收或處理這些信息

同樣,在Sax的解析過程中,讀取到文檔開頭、結(jié)尾,元素的開頭和結(jié)尾都會(huì)觸發(fā)一些回調(diào)方法,你可以在這些回調(diào)方法中進(jìn)行相應(yīng)事件處理

這四個(gè)方法是:startDocument() 、 endDocument()、 startElement()、 endElement

此外,光讀取到節(jié)點(diǎn)處是不夠的,我們還需要characters()方法來仔細(xì)處理元素內(nèi)包含的內(nèi)容

將這些回調(diào)方法集合起來,便形成了一個(gè)類,這個(gè)類也就是我們需要的觸發(fā)器

一般從Main方法中讀取文檔,卻在觸發(fā)器中處理文檔,這就是所謂的事件驅(qū)動(dòng)解析方法

如上圖,在觸發(fā)器中,首先開始讀取文檔,然后開始逐個(gè)解析元素,每個(gè)元素中的內(nèi)容會(huì)返回到characters()方法

接著結(jié)束元素讀取,所有元素讀取完后,結(jié)束文檔解析

現(xiàn)在我們開始創(chuàng)建觸發(fā)器這個(gè)類,要?jiǎng)?chuàng)建這個(gè)類首先需要繼承DefaultHandler

創(chuàng)建SaxHandler,并覆寫相應(yīng)方法:

復(fù)制代碼 代碼如下:

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

 
public class SaxHandler extends DefaultHandler {

    /* 此方法有三個(gè)參數(shù)
       arg0是傳回來的字符數(shù)組,其包含元素內(nèi)容
       arg1和arg2分別是數(shù)組的開始位置和結(jié)束位置 */
    @Override
    public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
        String content = new String(arg0, arg1, arg2);
        System.out.println(content);
        super.characters(arg0, arg1, arg2);
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("\n…………結(jié)束解析文檔…………");
        super.endDocument();
    }

    /* arg0是名稱空間
       arg1是包含名稱空間的標(biāo)簽,如果沒有名稱空間,則為空
       arg2是不包含名稱空間的標(biāo)簽 */
    @Override
    public void endElement(String arg0, String arg1, String arg2)
            throws SAXException {
        System.out.println("結(jié)束解析元素  " + arg2);
        super.endElement(arg0, arg1, arg2);
    }

    @Override
    public void startDocument() throws SAXException {
        System.out.println("…………開始解析文檔…………\n");
        super.startDocument();
    }

    /*arg0是名稱空間
      arg1是包含名稱空間的標(biāo)簽,如果沒有名稱空間,則為空
      arg2是不包含名稱空間的標(biāo)簽
      arg3很明顯是屬性的集合 */
    @Override
    public void startElement(String arg0, String arg1, String arg2,
            Attributes arg3) throws SAXException {
        System.out.println("開始解析元素 " + arg2);
        if (arg3 != null) {
            for (int i = 0; i < arg3.getLength(); i++) {
                 // getQName()是獲取屬性名稱,
                System.out.print(arg3.getQName(i) + "=\"" + arg3.getValue(i) + "\"");
            }
        }
        System.out.print(arg2 + ":");
        super.startElement(arg0, arg1, arg2, arg3);
    }
}

XML文檔:
復(fù)制代碼 代碼如下:

<?xml version="1.0" encoding="UTF-8"?> 
<books> 
   <book id="001"> 
      <title>Harry Potter</title> 
      <author>J K. Rowling</author> 
   </book> 
   <book id="002"> 
      <title>Learning XML</title> 
      <author>Erik T. Ray</author> 
   </book> 
</books>

TestDemo測試類:
復(fù)制代碼 代碼如下:

import java.io.File;

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

 
public class TestDemo {

    public static void main(String[] args) throws Exception {
        // 1.實(shí)例化SAXParserFactory對(duì)象
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 2.創(chuàng)建解析器
        SAXParser parser = factory.newSAXParser();
        // 3.獲取需要解析的文檔,生成解析器,最后解析文檔
        File f = new File("books.xml");
        SaxHandler dh = new SaxHandler();
        parser.parse(f, dh);
    }
}

輸出結(jié)果:
復(fù)制代碼 代碼如下:

…………開始解析文檔…………

開始解析元素 books
books: 

開始解析元素 book
id="001"book: 

開始解析元素 title
title:Harry Potter
結(jié)束解析元素  title

       
開始解析元素 author
author:J K. Rowling
結(jié)束解析元素  author

    
結(jié)束解析元素  book

    
開始解析元素 book
id="002"book: 

開始解析元素 title
title:Learning XML
結(jié)束解析元素  title

       
開始解析元素 author
author:Erik T. Ray
結(jié)束解析元素  author

    
結(jié)束解析元素  book

 
結(jié)束解析元素  books

…………結(jié)束解析文檔…………

上面的雖然正確顯示了執(zhí)行流程,但是輸出卻很亂

為了更加清晰的執(zhí)行此流程,我們還可以重寫SaxHandler,使其將原先的xml文檔還原一遍

重寫的SaxHandler類:

復(fù)制代碼 代碼如下:

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

 
public class SaxHandler extends DefaultHandler {

    @Override
    public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
        System.out.print(new String(arg0, arg1, arg2));
        super.characters(arg0, arg1, arg2);
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("\n結(jié)束解析");
        super.endDocument();
    }

    @Override
    public void endElement(String arg0, String arg1, String arg2)
            throws SAXException {
        System.out.print("</");
        System.out.print(arg2);
        System.out.print(">");
        super.endElement(arg0, arg1, arg2);
    }

    @Override
    public void startDocument() throws SAXException {
        System.out.println("開始解析");
        String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
        System.out.println(s);
        super.startDocument();
    }

    @Override
    public void startElement(String arg0, String arg1, String arg2,
            Attributes arg3) throws SAXException {

        System.out.print("<");
        System.out.print(arg2);

        if (arg3 != null) {
            for (int i = 0; i < arg3.getLength(); i++) {
                System.out.print(" " + arg3.getQName(i) + "=\"" + arg3.getValue(i) + "\"");
            }
        }
        System.out.print(">");
        super.startElement(arg0, arg1, arg2, arg3);
    }

}

執(zhí)行結(jié)果:

現(xiàn)在看起來好多了,將其還原更能充分說明其解析流程

相關(guān)文章

  • 淺析Java中comparator接口與Comparable接口的區(qū)別

    淺析Java中comparator接口與Comparable接口的區(qū)別

    本文要來詳細(xì)分析一下Java中Comparable和Comparator接口的區(qū)別,兩者都有比較的功能,那么究竟有什么區(qū)別呢,感興趣的Java開發(fā)者繼續(xù)看下去吧
    2016-10-10
  • Java常見的3種文件上傳方法和速度對(duì)比

    Java常見的3種文件上傳方法和速度對(duì)比

    這篇文章介紹了Java常見的3種文件上傳方法和速度對(duì)比,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 一口氣說出Java 6種延時(shí)隊(duì)列的實(shí)現(xiàn)方法(面試官也得服)

    一口氣說出Java 6種延時(shí)隊(duì)列的實(shí)現(xiàn)方法(面試官也得服)

    這篇文章主要介紹了一口氣說出Java 6種延時(shí)隊(duì)列的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java Web之限制用戶多處登錄實(shí)例代碼

    Java Web之限制用戶多處登錄實(shí)例代碼

    本篇文章主要介紹了Java Web之限制用戶多處登錄實(shí)例代碼,可以限制單個(gè)用戶在多個(gè)終端登錄。非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-03-03
  • m1 Mac設(shè)置多jdk版本并動(dòng)態(tài)切換的實(shí)現(xiàn)

    m1 Mac設(shè)置多jdk版本并動(dòng)態(tài)切換的實(shí)現(xiàn)

    本文主要介紹 Mac 下如何安裝 JDK 并且多版本如何切換,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java實(shí)戰(zhàn)寵物店在線交易平臺(tái)的實(shí)現(xiàn)流程

    Java實(shí)戰(zhàn)寵物店在線交易平臺(tái)的實(shí)現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+maven+Mysql+FreeMarker實(shí)現(xiàn)一個(gè)寵物在線交易系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2022-01-01
  • Java?WebService開源框架CXF詳解

    Java?WebService開源框架CXF詳解

    本文詳細(xì)講解了Java?WebService開源框架CXF,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • java編程經(jīng)典案例之基于斐波那契數(shù)列解決兔子問題實(shí)例

    java編程經(jīng)典案例之基于斐波那契數(shù)列解決兔子問題實(shí)例

    這篇文章主要介紹了java編程經(jīng)典案例之基于斐波那契數(shù)列解決兔子問題,結(jié)合完整實(shí)例形式分析了斐波那契數(shù)列的原理及java解決兔子問題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Java如何使用Set接口存儲(chǔ)沒有重復(fù)元素的數(shù)組

    Java如何使用Set接口存儲(chǔ)沒有重復(fù)元素的數(shù)組

    Set是一個(gè)繼承于Collection的接口,即Set也是集合中的一種。Set是沒有重復(fù)元素的集合,本篇我們就用它存儲(chǔ)一個(gè)沒有重復(fù)元素的數(shù)組
    2022-04-04
  • java實(shí)現(xiàn)希爾排序算法

    java實(shí)現(xiàn)希爾排序算法

    希爾排序(Shell Sort)是插入排序的一種,是針對(duì)直接插入排序算法的改進(jìn),是將整個(gè)無序列分割成若干小的子序列分別進(jìn)行插入排序,希爾排序并不穩(wěn)定。該方法又稱縮小增量排序,因DL.Shell于1959年提出而得名。
    2015-04-04

最新評(píng)論