• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • XML的SAX解析以及DOM解析和SAX解析區別

    前言:

    XML解析工具

    DOM解析原理:
        1)JAXP (oracle-Sun公司官方)
        2)JDOM工具(非官方)
        3)Dom4J工具(非官方)
        三大框架(默認讀取xml的工具就是Dom4j)
        .......
    
    SAX解析原理:
        1)Sax解析工具(oracle-sun公司官方)

    老樣子,三個問題:

    SAX解析是什么?
    SAX怎么用?
    SAX運用場景?

    SAX是什么?

    也是用來解析XML的
    SAX解析工具- 內置在jdk中。org.xml.sax.*

    SAX運用場景?

    DOM解析原理:一次性把xml文檔加載進內存,然后在內存中構建Document樹。
    對內存要求比較要。   
    缺點: 不適合讀取大容量的xml文件,容易導致內存溢出。
    

    SAX解析原理: 加載一點,讀取一點,處理一點。對內存要求比較低。

    SAX解析工具核心:

    核心的API:

    SAXParser類: 用于讀取和解析xml文件對象
    parse(File f, DefaultHandler dh)方法: 解析xml文件

    參數一: File:表示 讀取的xml文件。
    參數二: DefaultHandler: SAX事件處理程序。使用DefaultHandler的子類

    第一步:創建對象

        //1.創建SAXParser對象
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
    
            //2.調用parse方法
            /**
             * 參數一: xml文檔
             * 參數二: DefaultHandler的子類   MyDefaultHandler()為自定義
             */
        parser.parse(new File(".\\src\\Go\\person.xml"),  
        new MyDefaultHandler());

    注意:
    這里創建SAXParser對象 不能直接通過構造函數來創造,因為用到了單例工廠模式。

    鏈接:類 SAXParser的jdk文檔

    這里寫圖片描述
    這里寫圖片描述
    這里寫圖片描述
    這里寫圖片描述

    所以創建一個SAXParser對象 需要:
    SAXParserFactory.newInstance().newSAXParser();

    DefaultHandler類的API:后三個最重要

    1. void startDocument() : 在讀到文檔開始時調用
    2. void endDocument() :在讀到文檔結束時調用
    3. void startElement(String uri, String localName, String qName, Attributes attributes) :
      讀到開始標簽時調用
    4. void endElement(String uri, String localName, String qName) :讀到結束標簽時調用
    5. void characters(char[] ch, int start, int length) : 讀到文本內容時調用

    第二步:自定義類繼承DefaultHandler重寫方法

    這些都是要重寫的 舉個例子:

    public class MyDefaultHandler extends DefaultHandler {
    
        /**
         * 開始文檔時調用
         */
        @Override
        public void startDocument() throws SAXException {
            System.out.println("MyDefaultHandler.startDocument()");
        }
    
        /**
         * 開始標簽時調用
         * @param qName: 表示開始標簽的標簽名
         * @param attributes: 表示開始標簽內包含的屬性列表
         */
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            System.out.println("MyDefaultHandler.startElement()-->"+qName);
        }
    
        /**
         * 結束標簽時調用
         * @param qName: 結束標簽的標簽名稱
         */
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            System.out.println("MyDefaultHandler.endElement()-->"+qName);
        }
    
        /**
         * 讀到文本內容的時調用
         * @param ch: 表示當前讀完的所有文本內容
         * @param start: 表示當前文本內容的開始位置
         * @param length: 表示當前文本內容的長度
         * char[](                                       張三              20)   100
         *                              98 2   
         */ 
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            //得到當前文本內容
            String content = new String(ch,start,length);
            System.out.println("MyDefaultHandler.characters()-->"+content);
        }
    
        /**
         * 結束文檔時調用
         */
        @Override
        public void endDocument() throws SAXException {
            System.out.println("MyDefaultHandler.endDocument()");
        }
    
    }

    xml樣例:

    <?xml version="1.0" encoding="utf-8"?>
    <contactList>
        <contact id="001" name="eric">
            <name>張三</name>
            <age>20</age>
            <phone>134222223333</phone>
            <email>[email protected]</email>
            <qq>432221111</qq>
        </contact>
        <contact id="002" name="jacky">
            <name>eric</name>
            <age>20</age>
            <phone>134222225555</phone>
            <email>[email protected]</email>
            <qq>432222222</qq>
        </contact>
    </contactList>

    結果:

    MyDefaultHandler.startDocument()
    MyDefaultHandler.startElement()-->contactList
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->contact
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->name
    MyDefaultHandler.characters()-->張三
    MyDefaultHandler.endElement()-->name
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->age
    MyDefaultHandler.characters()-->20
    MyDefaultHandler.endElement()-->age
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->phone
    MyDefaultHandler.characters()-->134222223333
    MyDefaultHandler.endElement()-->phone
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->email
    MyDefaultHandler.characters()-->[email protected]
    MyDefaultHandler.endElement()-->email
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->qq
    MyDefaultHandler.characters()-->432221111
    MyDefaultHandler.endElement()-->qq
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.endElement()-->contact
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->contact
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->name
    MyDefaultHandler.characters()-->eric
    MyDefaultHandler.endElement()-->name
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->age
    MyDefaultHandler.characters()-->20
    MyDefaultHandler.endElement()-->age
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->phone
    MyDefaultHandler.characters()-->134222225555
    MyDefaultHandler.endElement()-->phone
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->email
    MyDefaultHandler.characters()-->[email protected]
    MyDefaultHandler.endElement()-->email
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.startElement()-->qq
    MyDefaultHandler.characters()-->432222222
    MyDefaultHandler.endElement()-->qq
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.endElement()-->contact
    MyDefaultHandler.characters()-->
    
    MyDefaultHandler.endElement()-->contactList
    MyDefaultHandler.endDocument()
    

    注意:
    問題:MyDefaultHandler.characters()–>空白 ?

    答:

        <contactList>
        <contact>
        之間也是有文本的 是換行和空格 被characters方法讀取了。
    

    來看一下SAX解析XML的流程圖:(圖片來自傳智播客)
    回到開頭SAX解析原理: 加載一點,讀取一點,處理一點。對內存要求比較低。
    這里寫圖片描述


    總結:

    ==================DOM解析 vs SAX解析 ============================

    DOM解析 :

    原理: 一次性加載xml文檔,不適合大容量的文件讀取
    DOM解析可以任意進行增刪改成
    DOM解析任意讀取任何位置的數據,甚至往回讀
    DOM解析面向對象的編程方法(Node,Element,Attribute),  
    Java開發者編碼比較簡單。

    SAX解析 :

    原理: 加載一點,讀取一點,處理一點。適合大容量文件的讀取
    SAX解析只能讀取
    SAX解析只能從上往下,按順序讀取,不能往回讀
    SAX解析基于事件的編程方法。java開發編碼相對復雜。

    XML操作:

                1)Dom4j修改xml文檔
                     new XMLWrier();
                        ......
                2)xPath技術: 快速查詢xml節點
                        selectNodes()
                        selectSinglNode();  
                3)  SAX解析
                        SAXParser parse
                            parser()
                    DefaultHandler類:
                            startElement();
                            characters();
                            endElement();
    
    版權聲明:本文為qq_38409944原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_38409944/article/details/80584942

    智能推薦

    XML解析___使用Dom or使用Sax

    xml解析方式分為兩種,dom和sax dom:(Document Object Model,即對文檔對象模型)是W3C組織推薦的處理XML的一種方式 Sax:(Simple API for  XML)不是官方標準,但它是xml社區事實上的標準,幾乎所有的xml解析器都支持它。   XML解析開發包 Jaxp、Jdom、dom4J   使用DOM解析XML介紹 DOM...

    android SAX解析XML

    SAX(Simple APIfor XML)解析器是一種基于事件的解析器,事件驅動的流式解析方式是,從文件的開始順序解析到文檔的結束,不可暫停或倒退。它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來工作的。當事件源產生事件后,調用事件處理器相應的處理方法,一個事件就可以得到處理。在事件源調用事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態信息,這樣事件處理器才能夠根據提供的...

    android SAX解析XML

    SAX(Simple API for XML)是一個解析速度快并且占用內存少的xml解析器,非常適合用于Android等移動設備。 SAX解析XML文件采用的是事件驅動,順序讀取XML文件,邊加載邊解析。也就是說,它并不需要解析完整個文檔,在按內容順序解析文檔的過程中,SAX會判斷當前讀到的字符是否合法XML語法中的某部分,如果符合就會觸發事件。(如:當遇到像文件開頭,文檔結束,或者標簽開頭與標簽...

    SAX-解析XML

    基于SAX的xml解析 sax通常用來進行查找,就是搜索使用,大概流程如下 解析器工廠 解析器 XMLReader 處理器ContentHandler,這部分需要程序員自己寫 進行遍歷和指定位置查找 小結 SAX的優勢在于,找多少就加載多少,不會一下子擠滿內存,但是缺點是比較麻煩- -,處理部分 得程序員自己手寫,其實也還好.做個筆記把...

    猜你喜歡

    SAX解析XML

    sax解析xml文檔是邊讀邊解的,解析時是按照提前設置好的事件處理方式來執行的。如果你在解析時,想回到前面的節點再次進行解析,對不起做不到。sax的解析方式就決定了它只能做讀的操作,不能做修改、添加、刪除的操作。 sun公司將sax解析的事件分為ContentHandler(內容事件),ErrorHandler(錯誤事件),DTDHandler(DTD約束事件),EntityResolver(實體...

    sax解析xml

    通sax方式解析xml                        ...

    XML解析--使用Sax

    文章目錄 一、使用SAX解析XML介紹 二、使用SAX解析XML的步驟 三、Sax解析XML實例 (1)給出需要解析的XML文件 (2)使用Sax對XML進行解析 一、使用SAX解析XML介紹 SAX解析可以在讀取文檔的時候,就對文檔進行處理,而不必等到整個文檔裝載完才對文檔進行處理。 優點:解析可以立即開始,速度快,沒有內存壓力。 缺點:不能對節點做修改。 二、使用SAX解析XML的步驟 使用S...

    XML:SAX解析

    SAX解析 SAX采用事件處理的方式解析XML文件,利用 SAX 解析 XML 文檔,涉及兩個部分:解析器和事件處理器。 解析器可以使用JAXP的API創建,創建出SAX解析器后,就可以指定解析器去解析某個XML文檔。 解析器采用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會把當前解析到的xml文件內容作為...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    精品国产乱码久久久久久蜜桃不卡