目錄
1.SAX解析
1.1.SAX解析機制
1.2.SAX解析實例
1.2.SAX解析实例
首頁 後端開發 XML/RSS教程 XML—XML解析之SAX

XML—XML解析之SAX

Feb 24, 2017 pm 03:06 PM

1.SAX解析

  • #在使用DOM解析XML文檔時,需要讀取整個XML文檔,並在記憶體中構建整個DOM樹的Document對象,從而再對XML文件進行操作。此種情況下,如果XML文檔特別大,就會消耗計算機的大量內存,嚴重的情況下可能還會導致內存溢出。

  • SAX解析允許在讀取文件的時候,即對文件進行處理,而不必等到整個文件裝載完才對文件進行操作。

  • 透過繼承DefaultHandler,來發展一個SAX解析器

【注意】SAX主要用於XML文件的解析,不能去修改、刪除、新增元素。

1.1.SAX解析機制

sax是一種推式的機制,你建立一個sax解析器,解析器在發現xml文件中的內容時就告訴你(把事件推給你,有點類似java swing中的事件監聽)。如何處理這些發現的內容,由程式設計師自己決定。

在基於sax的程式中,有五個最常用的sax事件:

#1.startDocument()–>告訴你解析器發現了文件的開始,告訴你解析器開始掃描文件
 2.endDocument()–>告訴你解析器發現了文件結尾
 3.startElement()–>告訴你解析器發現了一個起始標籤,該事件告訴你標籤的名稱、該元素所有的屬性名稱和值
4.characters()–>告訴你解析器發現了一些文本,將得到一個字元數組,該數組的偏移量和一個長度偏移量,有這三個變數你可以得到解析器發現的文本
5.endElement()–>告訴你解析器發現了一個結束標籤,該事件告訴你元素的名稱

1.2.SAX解析實例

依然使用DOM解析中用到的XML例子,如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>
登入後複製
登入後複製

【步驟】:

1.使用SAXParserFactory建立SAX解析工廠

SAXParserFactory spf = SAXParserFactory.newInstance();
登入後複製
登入後複製

2.透過SAX解析工廠得到解析器物件

SAXParser sp = spf.newSAXParser();
登入後複製
登入後複製

3.將解析物件和事件處理器物件關聯

sp.parse("src/myClass.xml",new MyHandler());
登入後複製
登入後複製

這裡的MyHandler需要自己定義,並且它要繼承DefaultHandler,然後在MyHandler類別中重寫上文提到的5個sax事件方法,當然也可以只重寫自己需要的。
例如現在我寫的MyHandler如下:

class MyHandler extends DefaultHandler{    /**
     * 发现文档开始,该函数只会被调用一次
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("startDocument");
    }    /**
     * 发现文档结束,该函数只会被调用一次
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("endDocument");
    }    /**
     * 发现XML中的一个元素开始,会被反复调用
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("元素名称:"+qName);
    }    /**
     * 发现XML中的一个元素结束,会被反复调用
     */
    @Override
    public void endElement(String uri, String localName, String qName)            
    throws SAXException {

    }    /**
     * 发现XML文件中的文本,会被反复调用
     */
    @Override
    public void characters(char[] ch, int start, int length)            
    throws SAXException {        // 显示文本内容
        String text = new String(ch,start,length);        if(!text.trim().equals("")){
            System.out.println(text);
        }
    }
}
登入後複製

運行結果如下:

XML—XML解析之SAX

可以看到,這是對XML文檔的一種遍歷,而sax所能做的也只是遍歷了。


那麼,如果現在我們有這樣一個需求:只顯示所有學生的姓名和年齡,不顯示學生的介紹,怎麼實現呢?

我們可以在MyHandler類別中定義兩個布林變數isName和isAge,在startElement方法中標識是否是姓名元素或年齡元素,如果是的話才在characters方法中取得對應的文本,如下:

1.定義兩個布林變數

private boolean isName = false;private boolean isAge = false;
登入後複製
登入後複製

2.在startElement方法中加入判斷

@Overridepublic void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        this.isName = true;
    }else if(qName.equals("年龄")){        this.isAge = true;
    }
}
登入後複製

#3.在characters方法中根據標識符進行判斷是否取得文字

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 显示文本内容
    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){
        System.out.println(text);
    }
    isName = false;
    isAge = false;
}
登入後複製
登入後複製

最後要記得將兩個布林變數重設為false。
運行結果如下:

XML—XML解析之SAX

1.SAX解析

  • 在使用DOM解析XML文檔時,需要讀取整個XML文檔,在記憶體中建構整個DOM樹的Document對象,從而再對XML文檔進行操作。此種情況下,如果XML文檔特別大,就會消耗計算機的大量內存,嚴重的情況下可能還會導致內存溢出。

  • SAX解析允許在讀取文件的時候,即對文件進行處理,而不必等到整個文件裝載完才對文件進行操作。

  • 透過繼承DefaultHandler,來發展一個SAX解析器

【注意】SAX主要用於XML文件的解析,不能去修改、刪除、新增元素。

1.1.SAX解析機制

sax是一種推式的機制,你建立一個sax解析器,解析器在發現xml文件中的內容時就告訴你(把事件推給你,有點類似java swing中的事件監聽)。如何處理這些發現的內容,由程式設計師自己決定。

在基於sax的程式中,有五個最常用的sax事件:

1.startDocument()–>告诉你解析器发现了文档的开始,告诉你解析器开始扫描文档
2.endDocument()–>告诉你解析器发现了文档结尾
3.startElement()–>告诉你解析器发现了一个起始标签,该事件告诉你标签的名称、该元素所有的属性名和值
4.characters()–>告诉你解析器发现了一些文本,将得到一个字符数组,该数组的偏移量和一个长度偏移量,有这三个变量你可以得到解析器发现的文本
5.endElement()–>告诉你解析器发现了一个结束标签,该事件告诉你元素的名称

1.2.SAX解析实例

依然使用DOM解析中用到的XML例子,如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>
登入後複製
登入後複製

【步骤】:

1.使用SAXParserFactory创建SAX解析工厂

SAXParserFactory spf = SAXParserFactory.newInstance();
登入後複製
登入後複製

2.通过SAX解析工厂得到解析器对象

SAXParser sp = spf.newSAXParser();
登入後複製
登入後複製

3.将解析对象和事件处理器对象关联

sp.parse("src/myClass.xml",new MyHandler());
登入後複製
登入後複製

这里的MyHandler需要自己定义,并且它要继承DefaultHandler,然后在MyHandler类中重写上文提到的5个sax事件方法,当然也可以只重写自己需要的。
比如现在我写的MyHandler如下:

class MyHandler extends DefaultHandler{    /**
     * 发现文档开始,该函数只会被调用一次
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("startDocument");
    }    /**
     * 发现文档结束,该函数只会被调用一次
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("endDocument");
    }    /**
     * 发现XML中的一个元素开始,会被反复调用
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("元素名称:"+qName);
    }    /**
     * 发现XML中的一个元素结束,会被反复调用
     */
    @Override
    public void endElement(String uri, String localName, String qName)            
    throws SAXException {

    }    /**
     * 发现XML文件中的文本,会被反复调用
     */
    @Override
    public void characters(char[] ch, int start, int length)            
    throws SAXException {        // 显示文本内容
        String text = new String(ch,start,length);        
        if(!text.trim().equals("")){
            System.out.println(text);
        }
    }
}
登入後複製

运行结果如下:

XML—XML解析之SAX

可以看到,这是对XML文档的一种遍历,而sax能够做的也只是遍历了。


那么,如果现在我们有这样一个需求:只显示所有学生的姓名和年龄,不显示学生的介绍,怎么实现呢?

我们可以在MyHandler类中定义两个布尔变量isName和isAge,在startElement方法中标识是否是姓名元素或者年龄元素,如果是的话才在characters方法中获取对应的文本,如下:

1.定义两个布尔变量

private boolean isName = false;private boolean isAge = false;
登入後複製
登入後複製

2.在startElement方法中添加判断

@Overridepublic void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {    if(qName.equals("名字")){        
        this.isName = true;
    }else if(qName.equals("年龄")){        this.isAge = true;
    }
}
登入後複製

3.在characters方法中根据标识符进行判断是否获取文本

@Overridepublic void characters(char[] ch, int start, int length)        throws SAXException {    // 显示文本内容
    String text = new String(ch,start,length);    if(!text.trim().equals("")&&(isName||isAge)){
        System.out.println(text);
    }
    isName = false;
    isAge = false;
}
登入後複製
登入後複製

最后要记得将两个布尔变量复位成false。
运行结果如下:

XML—XML解析之SAX

 以上就是XML—XML解析之SAX的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1658
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1231
24
能否用PowerPoint開啟XML文件 能否用PowerPoint開啟XML文件 Feb 19, 2024 pm 09:06 PM

XML檔可以用PPT開啟嗎? XML,即可擴展標記語言(ExtensibleMarkupLanguage),是一種廣泛應用於資料交換和資料儲存的通用標記語言。與HTML相比,XML更加靈活,能夠定義自己的標籤和資料結構,使得資料的儲存和交換更加方便和統一。而PPT,即PowerPoint,是微軟公司開發的一種用於創建簡報的軟體。它提供了圖文並茂的方

Python中的XML資料轉換為CSV格式 Python中的XML資料轉換為CSV格式 Aug 11, 2023 pm 07:41 PM

Python中的XML資料轉換為CSV格式XML(ExtensibleMarkupLanguage)是一種可擴充標記語言,常用於資料的儲存與傳輸。而CSV(CommaSeparatedValues)則是一種以逗號分隔的文字檔案格式,常用於資料的匯入和匯出。在處理資料時,有時需要將XML資料轉換為CSV格式以便於分析和處理。 Python作為一種功能強大

使用Python實現XML資料的篩選和排序 使用Python實現XML資料的篩選和排序 Aug 07, 2023 pm 04:17 PM

使用Python實現XML資料的篩選和排序引言:XML是一種常用的資料交換格式,它以標籤和屬性的形式儲存資料。在處理XML資料時,我們經常需要對資料進行篩選和排序。 Python提供了許多有用的工具和函式庫來處理XML數據,本文將介紹如何使用Python實現XML資料的篩選和排序。讀取XML檔案在開始之前,我們需要先讀取XML檔案。 Python有許多XML處理函式庫,

使用Python處理XML中的錯誤和異常 使用Python處理XML中的錯誤和異常 Aug 08, 2023 pm 12:25 PM

使用Python處理XML中的錯誤和異常XML是一種常用的資料格式,用於儲存和表示結構化的資料。當我們使用Python處理XML時,有時可能會遇到一些錯誤和異常。在本篇文章中,我將介紹如何使用Python來處理XML中的錯誤和異常,並提供一些範例程式碼供參考。使用try-except語句捕捉XML解析錯誤當我們使用Python解析XML時,有時候可能會遇到一些

Python實作XML與JSON之間的轉換 Python實作XML與JSON之間的轉換 Aug 07, 2023 pm 07:10 PM

Python實作XML與JSON之間的轉換導語:在日常的開發過程中,我們常常需要將資料在不同的格式之間轉換。 XML和JSON是常見的資料交換格式,在Python中,我們可以使用各種函式庫來實作XML和JSON之間的相互轉換。本文將介紹幾種常用的方法,並附帶程式碼範例。一、XML轉JSON在Python中,我們可以使用xml.etree.ElementTree模

使用Python實現XML和資料庫之間的資料同步 使用Python實現XML和資料庫之間的資料同步 Aug 07, 2023 pm 01:10 PM

使用Python實現XML與資料庫之間的資料同步導言:在實際的開發過程中,常常需要將XML資料與資料庫資料同步。 XML是一種常用的資料交換格式,而資料庫則是儲存資料的重要工具。本文將介紹如何使用Python實現XML和資料庫之間的資料同步,並給出程式碼範例。一、XML和資料庫的基本概念XML(ExtensibleMarkupLanguage)是一種可擴

C#開發中如何處理XML和JSON資料格式 C#開發中如何處理XML和JSON資料格式 Oct 09, 2023 pm 06:15 PM

C#開發中如何處理XML和JSON資料格式,需要具體程式碼範例在現代軟體開發中,XML和JSON是廣泛應用的兩種資料格式。 XML(可擴展標記語言)是一種用於儲存和傳輸資料的標記語言,而JSON(JavaScript物件表示)是一種輕量級的資料交換格式。在C#開發中,我們經常需要處理和操作XML和JSON數據,本文將重點放在如何使用C#處理這兩種數據格式,並附上

Python解析XML中的特殊字元和轉義序列 Python解析XML中的特殊字元和轉義序列 Aug 08, 2023 pm 12:46 PM

Python解析XML中的特殊字元和轉義序列XML(eXtensibleMarkupLanguage)是一種常用的資料交換格式,用於在不同系統之間傳輸和儲存資料。在處理XML檔案時,經常會遇到包含特殊字元和轉義序列的情況,這可能會導致解析錯誤或誤解資料。因此,在使用Python解析XML檔案時,我們需要了解如何處理這些特殊字元和轉義序列。一、特殊字元和

See all articles