亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

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

2019-11-26 16:08:34
字體:
來源:轉載
供稿:網友

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

Dom解析功能強大,可增刪改查,操作時會將xml文檔以文檔對象的方式讀取到內存中,因此適用于小文檔

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

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

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

在看電影的過程中,每遇到一個情節,一段淚水,一次擦肩,你都會調動大腦和神經去接收或處理這些信息

同樣,在Sax的解析過程中,讀取到文檔開頭、結尾,元素的開頭和結尾都會觸發一些回調方法,你可以在這些回調方法中進行相應事件處理

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

此外,光讀取到節點處是不夠的,我們還需要characters()方法來仔細處理元素內包含的內容

將這些回調方法集合起來,便形成了一個類,這個類也就是我們需要的觸發器

一般從Main方法中讀取文檔,卻在觸發器中處理文檔,這就是所謂的事件驅動解析方法

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

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

現在我們開始創建觸發器這個類,要創建這個類首先需要繼承DefaultHandler

創建SaxHandler,并覆寫相應方法:

復制代碼 代碼如下:

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

 
public class SaxHandler extends DefaultHandler {

    /* 此方法有三個參數
       arg0是傳回來的字符數組,其包含元素內容
       arg1和arg2分別是數組的開始位置和結束位置 */
    @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…………結束解析文檔…………");
        super.endDocument();
    }

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

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

    /*arg0是名稱空間
      arg1是包含名稱空間的標簽,如果沒有名稱空間,則為空
      arg2是不包含名稱空間的標簽
      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文檔:
復制代碼 代碼如下:

<?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測試類:
復制代碼 代碼如下:

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.實例化SAXParserFactory對象
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 2.創建解析器
        SAXParser parser = factory.newSAXParser();
        // 3.獲取需要解析的文檔,生成解析器,最后解析文檔
        File f = new File("books.xml");
        SaxHandler dh = new SaxHandler();
        parser.parse(f, dh);
    }
}

輸出結果:
復制代碼 代碼如下:

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

開始解析元素 books
books: 

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

開始解析元素 title
title:Harry Potter
結束解析元素  title

       
開始解析元素 author
author:J K. Rowling
結束解析元素  author

    
結束解析元素  book

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

開始解析元素 title
title:Learning XML
結束解析元素  title

       
開始解析元素 author
author:Erik T. Ray
結束解析元素  author

    
結束解析元素  book

 
結束解析元素  books

…………結束解析文檔…………

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

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

重寫的SaxHandler類:

復制代碼 代碼如下:

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結束解析");
        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);
    }

}

執行結果:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国语自产精品视频在免费| 欧美有码在线观看视频| 永久555www成人免费| 欧美激情xxxx性bbbb| 国产精品专区h在线观看| 亚洲第一在线视频| 欧美黑人极品猛少妇色xxxxx| 91中文在线观看| 欧美亚洲国产视频| 超碰97人人做人人爱少妇| 97成人超碰免| 日本精品久久中文字幕佐佐木| 国产精品入口尤物| 欧美激情欧美激情| 亚洲欧美国产一本综合首页| 欧美一级大片在线免费观看| 亚洲女同性videos| 91网在线免费观看| 一区二区欧美亚洲| 亚洲精品之草原avav久久| 欧美日韩国产中文精品字幕自在自线| 91夜夜未满十八勿入爽爽影院| 在线视频国产日韩| 午夜精品视频网站| 成人a在线观看| 91精品国产91久久| 成人a级免费视频| 国产精品入口尤物| 国产亚洲成av人片在线观看桃| 国产情人节一区| 亚洲精品小视频在线观看| 国产成人在线亚洲欧美| 久久久久九九九九| 日日噜噜噜夜夜爽亚洲精品| 欧美在线视频网| 日韩欧美国产网站| 91精品国产777在线观看| 国产中文欧美精品| 久久国产精品免费视频| 国产日韩中文字幕在线| 亚洲精品中文字幕av| 国产精品高清在线| 亚洲成人中文字幕| 尤物99国产成人精品视频| 色777狠狠综合秋免鲁丝| 亚洲美女性生活视频| 国产精品露脸自拍| 成人a视频在线观看| 日韩中文字幕免费视频| 久久精品99久久香蕉国产色戒| 日韩不卡中文字幕| 日日摸夜夜添一区| 91精品视频在线| 欧美亚洲激情视频| 国产成人精品日本亚洲专区61| 欧美剧在线观看| 亚洲欧美在线x视频| 国产精品久久久久久久久久久久久久| 久久国产精品网站| 亚洲人成电影在线观看天堂色| 中文字幕成人在线| 久久99热精品| 一区二区三区四区精品| 国产精品一区二区久久| 亚洲最大福利网| 欧美成人性色生活仑片| 久久国产精品久久久久久久久久| 久久精品国产电影| 国产成人涩涩涩视频在线观看| 亚洲欧洲黄色网| 成人精品一区二区三区电影免费| 久久人人爽人人爽爽久久| 国产成人免费av电影| 亚洲国内高清视频| 亚洲中国色老太| 色妞欧美日韩在线| 亚洲激情视频在线| 综合网日日天干夜夜久久| 国产91精品不卡视频| 超碰日本道色综合久久综合| 亚洲精品动漫100p| 免费99精品国产自在在线| 亚洲91av视频| 高清欧美性猛交xxxx黑人猛交| 91精品国产777在线观看| 97香蕉超级碰碰久久免费软件| 亚洲福利在线观看| yw.139尤物在线精品视频| 亚洲欧美日韩一区二区在线| 久热爱精品视频线路一| 在线播放国产精品| 欧美巨大黑人极品精男| 亚洲成人激情在线| 欧美成人午夜免费视在线看片| 91久久国产精品| 亚洲影院污污.| 欧美在线视频一二三| 成人av番号网| 精品亚洲精品福利线在观看| 欧美日韩国产二区| 91av在线网站| 久久久国产精彩视频美女艺术照福利| 美女精品久久久| 精品视频—区二区三区免费| 久久久人成影片一区二区三区观看| 国产色婷婷国产综合在线理论片a| 一区二区成人av| 国产一区二区久久精品| 国产在线视频一区| 欧美日韩成人在线视频| 日韩免费av一区二区| 久久琪琪电影院| 亚洲国产天堂久久综合| 97在线看福利| 在线丨暗呦小u女国产精品| 亚洲精品女av网站| 久久精品2019中文字幕| 97色伦亚洲国产| 日韩欧美一区二区三区久久| 中文字幕亚洲综合| 午夜精品久久久久久久99热| 亚洲午夜精品久久久久久性色| 91色视频在线导航| 高清一区二区三区四区五区| 青青草成人在线| 51色欧美片视频在线观看| 国产精品视频男人的天堂| 成人av在线亚洲| 国a精品视频大全| 久久久久久久久久婷婷| 国产视频精品在线| 国产综合在线观看视频| 国产精品吊钟奶在线| 亚洲欧美制服综合另类| 亚洲天堂开心观看| 欧美精品少妇videofree| 成人久久久久爱| 成人国内精品久久久久一区| 欧美一区二区三区艳史| 欧美裸体视频网站| 国产精品福利久久久| 在线不卡国产精品| 91精品久久久久久久久不口人| 欧美激情女人20p| 国产精品视频999| 精品国内产的精品视频在线观看| 久久网福利资源网站| 日韩在线www| 亲子乱一区二区三区电影| 亚洲一区二区福利| 5278欧美一区二区三区| 欧美激情亚洲激情| 国产不卡视频在线| 91精品国产电影| 亚洲欧美一区二区三区情侣bbw| 日本视频久久久| 亚洲欧洲日产国码av系列天堂| 91成人在线观看国产| 欧美日韩中文字幕日韩欧美| 亚洲美女精品成人在线视频| 中文字幕日韩有码| 555www成人网| 国产免费一区二区三区在线能观看| 亚洲美女精品久久|