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:后三個最重要
- void startDocument() : 在讀到文檔開始時調用
- void endDocument() :在讀到文檔結束時調用
- void startElement(String uri, String localName, String qName, Attributes attributes) :
讀到開始標簽時調用- void endElement(String uri, String localName, String qName) :讀到結束標簽時調用
- 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();
智能推薦
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(實體...
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文件內容作為...