XML 解析---dom解析和sax解析,xml---domsax解析

來源:互聯網
上載者:User

XML 解析---dom解析和sax解析,xml---domsax解析

目前XML解析的方法主要用兩種:


1、dom解析:(Document Object Model,即文件物件模型)是W3C組織推薦的解析XML的一種方式。
使用dom解析XML文檔,該解析器會先把XML文檔載入到記憶體中,產生該XML文檔對應的document對象,然後把XML文檔中的各個標籤元素變成相應的Element對象,文本會變成Text對象,屬性會變成Attribute對象,並按這些標籤、文本、屬性在XML文檔中的關係儲存這些對象的關係。

缺點:消耗記憶體,所以使用dom解析XML文檔時不能解析太大的XML文檔,否則有可能會造成記憶體溢出。
優點:使用dom解析XML文檔可以很方便的執行增刪改查操作(可以直接根據節點對應的對象進行操作)。

2、sax解析:Simple API for XML,不是官方標準,但它是XML社區事實上的標準,幾乎所有的XML解析器都支援它。

使用sax解析XML文檔,該解析器會從上往下讀,讀一行,解析一行;

優點:因為它解析XML文檔是採取讀一行,解析一行的方式,所以它不會對記憶體造成壓力。
缺點:不適合執行增刪改查的操作(也是因為它解析XML文檔時採取的讀一行解析一行的方式,所以它不能往回操作),只適合對XML文檔進行讀取操作。

======================================================================================================

補充:

XML解析開發包:Jaxp(sun)、Jdom、dom4j;

======================================================================================================

調整JVM記憶體大小:


當我們要解析的XML文檔記憶體比較大、而且要對該XML中的節點資料進行相關的操作時,使用這兩種解析方式顯然都會不方便,這時就需要調整JVM記憶體的大小了。


JVM預設的允許最大記憶體容量是64M(根據jdk的版本不同,預設的最大容量值不一樣,jdk5.0版本的是64MB,jdk7版本的是170MB)。

調整JVM記憶體大小的方法(相應的命令為:-Xmx記憶體大小值單位):

在Eclipse中的項目導航框中右擊相應的Java程式》》Run As》》Open Run Dialog...》》開啟Run對話方塊》》選擇Arguments選項,在開視窗中有兩個輸入框,第一個是程式的參數輸入框,第二個是VM的參數輸入框,在第二個VM的參數輸入框中輸入Xmx200M》》點擊右下角的Run按鈕,執行相應的Java程式,就不會報OutOfMemoryError的錯誤了。

======================================================================================================

XML解析開發包:
1、JAXP:JAXP開發包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包組成。
在javax.xml.parsers包中,定義了幾個工廠類,程式員調用這些工廠類,可以得到XML文檔的dom或sax的解析器,從而實現對XML文檔的解析。

首先、建立工廠:
DocumentBuilderFactory factory = DocumentBuilderFactroy.newInstance();//因為DocumentBuilderFactory類是抽象類別,不能new出它的對象只能調用它的靜態方法擷取它的對象。
其次、得到dom解析器:
DocumentBuilder builder = factory.newDocumentBuilder();
然後、載入XML文檔,得到代表文檔的Document對象:
Document document = builder.parse("*.xml");
拿到代表XML文檔的document對象就可以操作XML文檔中的各個節點了。

======================================================================================================

補充:
dom解析下,XML文檔的每一個組成部分都會用一個對象表示,例如標籤用Element,屬性用Attribute,但不管什麼對象,都是Node的子類,所以在開發中可以把擷取到的任意節點都當作Node對待。 

XML編程(CRUD)
create、read、update、delete
添加、查詢、更新、刪除;

除了這兩種解析方法外,還有另外的解析方法。。。
======================================================================================================

在對XML文檔進行添加、修改和刪除操作時,不僅要更新document對象還要更新XML文檔(把更新後的document對象重寫到XML文檔中)。

javax.xml.transform包中的Transformer類用於把代表XML文檔的Document對象轉換為某種格式後輸出,例如把XML文檔應用樣式表後轉換成一個HTML文檔。利用這個對象,當然也可以把Document對象又重新寫入到一個XML文檔中。源和目的地。可以通過:
javax.xml.transform.dom.DOMSource類來關聯要轉換的document對象,
用javax.xml.transform.stream.StreamResult對象來表示資料的目的地。
Transformer對象通過TransformerFactory獲得。
Transformer類通過transform方法完成轉換操作,該方法接收個
(工廠對象(TransformerFactory)》》》轉換器對象(Transformer)》》》轉換方法(transform(DOMSource 源,StreamResult 目的地);))
======================================================================================================

SAX解析:

SAX解析採用事件處理的方式解析XML檔案,利用SAX解析XML文檔,涉及兩個部分:解析器和事件處理器:
解析器可以使用JAXP的API建立,建立出SAX解析器後,就可以指定解析器去去解析某個XML文檔。
解析器採用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個指定部分,都會去呼叫事件處理器的一個方法,解析器在呼叫事件處理器的方法時,會把當前解析到的XML檔案內容作為方法的參數傳遞給事件處理器。
事件處理器由程式員編寫,程式員通過事件處理器中方法的參數,就可以很輕鬆的得到SAX解析器解析到的資料,從而可以決定如何對資料進行處理。

1、建立解析工廠;
SAXParserFactory fac = SAXParserFactory.newInstance();

2、擷取解析器;
SAXParser sp = fac.newSAXParser();

3、得到讀取器;
XMLReader re = sp.getXMLReader();

4、設定內容處理器;
re.setContentHandler(new ContentHandler(){ /*實現介面的代碼塊*/});
(或者:re.setContentHandler(new DefaultHandler());/*參數為DefaultHandler類的子類*/)
第一種方法是解析整個XML文檔,第二種方法可以只解析某個標籤;
其實還有一種內容處理器,也是先繼承DefaultHandler類,然後把解析的內容封裝到bean對象中。 

5、讀取XML文檔內容;
re.parse("*.xml"); 

======================================================================================================

XML解析開發包:

2、dom4j:

SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(new File());

OutputFormat format = OutputFormat.createPrettyPrint();//該對象標明格式按漂亮的格式進行輸出;另外還有一個對象是按緊湊的格式進行輸出;
format.setEncoding("UTF-8");

XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(),format);
xmlWriter.write(doc);//如果xmlWriter對象採用的流是位元組流,那麼該對象會先把doc對象按format對象給定的編碼格式轉換成位元組,然後把資料交給位元組流進行操作。
writer.close();//最後要關閉資源

======================================================================================================

XPath:
使用XPath可以快速定位到某個節點;
List list = document.selectNodes("//foo/bar");//擷取foo節點下的所有bar節點;

Node node = document.selectSingleNode("//foo/bar");//擷取foo節點下的第一個bar節點;

單斜杠是絕對路徑即從根節點開始;
雙斜杠是相對路徑即從所有當前節點開始;

星號“*”表示選擇所有由星號之前的路徑所定位的元素;
例如:
/aa/bb/*表示選擇所有路徑依附於/aa/bb的元素;
/*/*/*/bbb表示選擇所有的有3個祖先元素的bbb元素;
//bb[@*]表示選擇有任意屬性的bb元素;
//bb[not(@*)]表示選擇沒有屬性的bb元素;
//bb[@id='b1']表示選擇含有屬性id='b1'的bb元素;


















xml的解析方式Dom與SAX不同是什?

SAX概念
SAX是Simple API for XML的縮寫,它並不是由W3C官方所提出的標準,可以說是“民間”的事實標準。實際上,它是一種社區性質的討論產物。雖然如此,在XML中對SAX的應用絲毫不比DOM少,幾乎所有的XML解析器都會支援它。

與 DOM比較而言,SAX是一種輕量型的方法。我們知道,在處理DOM的時候,我們需要讀入整個的XML文檔,然後在記憶體中建立DOM樹,產生DOM樹上的每個Node對象。當文檔比較小的時候,這不會造成什麼問題,但是一旦文檔大起來,處理DOM就會變得相當費時費力。特別是其對於記憶體的需求,也將是成倍的增長,以至於在某些應用中使用DOM是一件很不划算的事(比如在applet中)。這時候,一個較好的替代解決方案就是SAX。

SAX 在概念上與DOM完全不同。首先,不同於DOM的文檔驅動,它是事件驅動的,也就是說,它並不需要讀入整個文檔,而文檔的讀入過程也就是SAX的解析過程。所謂事件驅動,是指一種基於回調(callback)機制的程式運行方法。(如果你對Java新的代理事件模型比較清楚的話,就會很容易理解這種機制了)

在XMLReader接受XML文檔,在讀入XML文檔的過程中就進行解析,也就是說讀入文檔的過程和解析的過程是同時進行的,這和DOM區別很大。解析開始之前,需要向XMLReader註冊一個ContentHandler,也就是相當於一個事件監聽器,在 ContentHandler中定義了很多方法,比如startDocument(),它定製了當在解析過程中,遇到文檔開始時應該處理的事情。當 XMLReader讀到合適的內容,就會拋出相應的事件,並把這個事件的處理權代理給ContentHandler,調用其相應的方法進行響應。
 
xml解析,dom sax stax的不同,為何dom解析大型xml速度慢

DOM解析器把XML文檔轉化為一個包含其內容的樹,並可以對樹進行遍曆。用DOM解析模型的優點是編程容易,開發人員只需要調用建樹的指令,然後利用 navigation APIs訪問所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由於使用 DOM解析器的時候需要處理整個XML文檔,所以對效能和記憶體的要求比較高,尤其是遇到很大的XML檔案的時候。由於它的遍曆能力,DOM解析器常用於 XML文檔需要頻繁的改變的服務中。
SAX解析器採用了基於事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以啟用一個回調方法,告訴該方法制定的標籤已經找到。SAX對記憶體的要求通常會比較低,因為它讓開發人員自己來決定所要處理的 tag.特別是當開發人員只需要處理文檔中所包含的部分資料時,SAX這種擴充能力得到了更好的體現。但用SAX解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同資料。
選擇DOM還是選擇SAX? 對於需要自己編寫代碼來處理XML文檔的開發人員來說, 選擇DOM還是SAX 解析模型是一個非常重要的設計 決策。 DOM採用建立樹形結構的方式訪問XML文檔,而SAX採用的事件模型。
SAX 處理的優點非常類似於流媒體的優點。分析能夠立即開始,而不是等待所有的資料被處理。而且,由於應用程式只是在讀取資料時檢查資料,因此不需要將資料存放區在記憶體中。這對於大型文檔來說是個巨大的優點。事實上,應用程式甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。一般來說,SAX還比它的替代者DOM快許多。
DOM是用與平台和語言無關的方式表示XML文檔的官方W3C標準。DOM是以階層組織的節點或資訊片斷的集合。這個階層允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文檔和構造階層,然後才能做任何工作。由於 它是基於資訊層次的,因而DOM被認為是基於樹或基於對象的。 DOM 以及廣義的基於樹的處理具有幾個優點。首先,由於樹在記憶體中是持久的,因此可以 修改它以便應用程式能對資料和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像SAX那樣是一次性的處理。DOM使用起來 也要簡單得多。
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.