最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

復制代碼 代碼如下:

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

 
public class SaxHandler extends DefaultHandler {

    /* 此方法有三個參數(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是包含名稱空間的標簽,如果沒有名稱空間,則為空
       arg2是不包含名稱空間的標簽 */
    @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是包含名稱空間的標簽,如果沒有名稱空間,則為空
      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.創(chuàng)建解析器
        SAXParser parser = factory.newSAXParser();
        // 3.獲取需要解析的文檔,生成解析器,最后解析文檔
        File f = new File("books.xml");
        SaxHandler dh = new SaxHandler();
        parser.parse(f, dh);
    }
}

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

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

開始解析元素 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類:

復制代碼 代碼如下:

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)文章

  • idea中導入別人的springboot項目的方法(圖文)

    idea中導入別人的springboot項目的方法(圖文)

    這篇文章主要介紹了idea中導入別人的springboot項目的方法(圖文),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 詳解關(guān)于springboot-actuator監(jiān)控的401無權(quán)限訪問

    詳解關(guān)于springboot-actuator監(jiān)控的401無權(quán)限訪問

    本篇文章主要介紹了詳解關(guān)于springboot-actuator監(jiān)控的401無權(quán)限訪問,非常具有實用價值,有興趣的可以了解一下
    2017-09-09
  • Java布隆過濾器的原理和實現(xiàn)分析

    Java布隆過濾器的原理和實現(xiàn)分析

    數(shù)組、鏈表、樹等數(shù)據(jù)結(jié)構(gòu)會存儲元素的內(nèi)容,一旦數(shù)據(jù)量過大,消耗的內(nèi)存也會呈現(xiàn)線性增長所以布隆過濾器是為了解決數(shù)據(jù)量大的一種數(shù)據(jù)結(jié)構(gòu)。本文就來和大家詳細說說布隆過濾器的原理和實現(xiàn),感興趣的可以了解一下
    2022-10-10
  • SpringMVC中處理Http請求的原理詳解

    SpringMVC中處理Http請求的原理詳解

    這篇文章主要介紹了SpringMVC中處理Http請求的原理詳解,當一個http請求過來了首先經(jīng)過的是DispatcherServlet這么一個前端控制器并調(diào)用了這個前端控制器的doService方法,這個方法最終我們發(fā)現(xiàn)它調(diào)用了doDispatcher這么一個方法,需要的朋友可以參考下
    2023-12-12
  • 詳解Java中-classpath和路徑的使用

    詳解Java中-classpath和路徑的使用

    本篇文章主要介紹了Java中-classpath和路徑的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • mybatis?collection和association的區(qū)別解析

    mybatis?collection和association的區(qū)別解析

    這篇文章主要介紹了mybatis?collection解析以及和association的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • SpringBoot @Autowired注解注入規(guī)則介紹

    SpringBoot @Autowired注解注入規(guī)則介紹

    這篇文章主要介紹了SpringBoot @Autowired注解注入規(guī)則介紹,具有很好的參考價值,希望對大家有所幫助。
    2021-11-11
  • Java 解析線程的幾種狀態(tài)詳解

    Java 解析線程的幾種狀態(tài)詳解

    這篇文章主要為大家詳細介紹了Java 解析線程的幾種狀態(tài),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java線程池用法實戰(zhàn)案例分析

    Java線程池用法實戰(zhàn)案例分析

    這篇文章主要介紹了Java線程池用法,結(jié)合具體案例形式分析了java線程池創(chuàng)建、使用、終止等相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2019-10-10
  • SpringBoot結(jié)合mybatis-plus實現(xiàn)分頁的項目實踐

    SpringBoot結(jié)合mybatis-plus實現(xiàn)分頁的項目實踐

    本文主要介紹了SpringBoot結(jié)合mybatis-plus實現(xiàn)分頁的項目實踐,主要基于MyBatis-Plus 自帶的分頁插件 PaginationInterceptor,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06

最新評論

沂水县| 石棉县| 鸡泽县| 山西省| 通榆县| 萝北县| 开封县| 石河子市| 许昌市| 岫岩| 阜宁县| 贺州市| 加查县| 永胜县| 玉溪市| 壶关县| 杭锦后旗| 灵武市| 台东县| 历史| 凤山市| 郸城县| 铜鼓县| 温州市| 怀安县| 和田县| 那坡县| 海兴县| 商丘市| 集安市| 农安县| 施甸县| 河源市| 太谷县| 阿合奇县| 墨竹工卡县| 云安县| 县级市| 静安区| 子长县| 大连市|