頻道欄目
首頁 > 資訊 > Java > 正文

Java 利用DOM和SAX解析XML

17-03-30        來源:[db:作者]  
收藏   我要投稿

Java 利用DOM和SAX解析XML

DOM解析

在DOM接口規范中,有四個基本的接口:Document,Node,NodeList以及NamedNodeMap。在這四個基本接口中,Document接口是對文檔進行操作的入口,它是從Node接口繼承過來的。Node接口是其他大多數接口的父類,象Document,Element,Attribute,Text,Comment等接口都是從Node接口繼承過來的。NodeList接口是一個節點的集合,它包含了某個節點中的所有子節點。NamedNodeMap接口也是一個節點的集合,通過該接口,可以建立節點名和節點之間的一一映射關系,從而利用節點名可以直接訪問特定的節點。

1.Document

Document接口代表了整個XML/HTML文檔,因此,它是整棵文檔樹的根,提供了對文檔中的數據進行訪問和操作的入口。

2.NodeList

NodeList接口提供了對節點集合的抽象定義,它并不包含如何實現這個節點集的定義。NodeList用于表示有順序關系的一組節點,比如某個節點的子節點序列。另外,它還出現在一些方法的返回值中,例如getElementsByTagName。

在DOM中,NodeList的對象是"live"的,換句話說,對文檔的改變,會直接反映到相關的NodeList對象中。例如,如果通過DOM獲得一個NodeList對象,該對象中包含了某個Element節點的所有子節點的集合,那么,當再通過DOM對Element節點進行操作(添加、刪除、改動節點中的子節點)時,這些改變將會自動地反映到NodeList對象中,而不需DOM應用程序再做其他額外的操作。

NodeList中的每個item都可以通過一個索引來訪問,該索引值從0開始。

3.NamedNodeMap

實現了NamedNodeMap接口的對象中包含了可以通過名字來訪問的一組節點的集合。不過注意,NamedNodeMap并不是從NodeList繼承過來的,它所包含的節點集中的節點是無序的。盡管這些節點也可以通過索引來進行訪問,但這只是提供了枚舉NamedNodeMap中所包含節點的一種簡單方法,并不表明在DOM規范中為NamedNodeMap中的節點規定了一種排列順序。

NamedNodeMap表示的是一組節點和其唯一名字的一一對應關系,這個接口主要用在屬性節點的表示上。與NodeList相同,在DOM中,NamedNodeMap對象也是"live"的。

4.Dom對象

一切都是節點(對象)

.Node對象:DOM結構中最為基本的對象

?Document對象:代表整個XML的文檔

?NodeList對象:包含一個或者多個Node的列表

?Element對象:代表XML文檔中的標簽元素

5.dom解析xml步驟

  1. importjavax.xml.parsers.*;
  2. importorg.w3c.dom.*;
  3. publicclassdom{
  4. publicstaticvoidmain(Stringargs[]){
  5. try{
  6. //建立解析器工廠
  7. DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
  8. //獲得解析器
  9. DocumentBuilderbuilder=factory.newDocumentBuilder();
  10. Documentdoc=builder.parse("candidate.xml");
  11. NodeListnl=doc.getElementsByTagName("PERSON");
  12. for(inti=0;iElementnode=(Element)nl.item(i);
  13. System.out.print("NAME:");
  14. System.out.println(node.getElementsByTagName("NAME").item(0).getFirstChild().getNodeValue());
  15. ……
  16. System.out.println();
  17. }
  18. }catch(Exceptione){e.printStackTrace();}
  19. }
  20. }
    import javax.xml.parsers.*; 
    
    import org.w3c.dom.*; 
    
    public class dom { 
    
    public static void main(String args[]){ 
    
    try{ 
    
    //建立解析器工廠
    
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    
    //獲得解析器
    
    DocumentBuilder builder=factory.newDocumentBuilder(); 
    
    Document doc=builder.parse("candidate.xml"); 
    
    NodeList nl =doc.getElementsByTagName("PERSON"); 
    
    for (int i=0;i

    程序詳解:

    1)DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();

    ?我們在這里使用DocumentBuilderFacotry的目的是為了創建與具體解析器無關的程序,當DocumentBuilderFactory類的靜態方法newInstance()被調用時,它根據一個系統變量來決定具體使用哪一個解析器。又因為所有的解析器都服從于JAXP所定義的接口,所以無論具體使用哪一個解析器,代碼都是一樣的。所以當在不同的解析器之間進行切換時,只需要更改系統變量的值,而不用更改任何代碼。這就是工廠所帶來的好處。

    2)?DocumentBuilderdb=dbf.newDocumentBuilder();

    ?當獲得一個工廠對象后,使用它的靜態方法newDocumentBuilder()方法可以獲得一個DocumentBuilder對象,這個對象代表了具體的DOM解析器。但具體是哪一種解析器,微軟的或者IBM的,對于程序而言并不重要

    3)然后,我們就可以利用這個解析器來對XML文檔進行解析了

    ?Documentdoc=db.parse("c:/xml/message.xml");

    ?DocumentBuilder的parse()方法接受一個XML文檔名作為輸入參數,返回一個Document對象,這個Document對象就代表了一個XML文檔的樹模型。以后所有的對XML文檔的操作,都與解析器無關,直接在這個Document對象上進行操作就可以了。而具體對Document操作的方法,就是由DOM所定義的了

    4).從上面得到的Document對象開始,我們就可以開始我們的DOM解析了。使用Document對象的getElementsByTagName()方法,我們可以得到一個NodeList對象,一個Node對象代表了一個XML文檔中的一個標簽元素,而NodeList對象,所代表的是一個Node對象的列表

    NodeListnl=doc.getElementsByTagName("message");?我們通過這樣一條語句所得到的是XML文檔中所有標簽對應的Node對象的一個列表。然后,我們可以使用NodeList對象的item()方法來得到列表中的每一個Node對象

    ?Nodemy_node=nl.item(0);

    5).當一個Node對象被建立之后,保存在XML文檔中的數據就被提取出來并封裝在這個Node中了。在這個例子中,要提取Message標簽內的內容,我們通常會使用Node對象的getNodeValue()方法

    ?Stringmessage

    =my_node.getFirstChild().getNodeValue();

    注意:請注意,這里還使用了一個getFirstChild()方法來獲得message下面的第一個子Node對象。雖然在message標簽下面除了文本外并沒有其它子標簽或者屬性,但是我們堅持在這里使用getFirstChild()方法,這主要和W3C對DOM的定義有關。W3C把標簽內的文本部分也定義成一個Node,所以先要得到代表文本的那個Node,我們才能夠使用getNodeValue()來獲取文本的內容。[page]

    6.dom基本對象詳解

    DOM的基本對象有5個:Document,Node,NodeList,Element和Attr

    Document對象代表了整個XML的文檔,所有其它的Node,都以一定的順序包含在Document對象之內,排列成一個樹形的結構,程序員可以通過遍歷這顆樹來得到XML文檔的所有的內容,這也是對XML文檔操作的起點。我們總是先通過解析XML源文件而得到一個Document對象,然后再來執行后續的操作。此外,Document還包含了創建其它節點的方法,比如createAttribute()用來創建一個Attr對象。它所包含的主要的方法有

    1).createAttribute(String):用給定的屬性名創建一個Attr對象,并可在其后使用setAttributeNode方法來放置在某一個Element對象上面。

    ?2)createElement(String):用給定的標簽名創建一個Element對象,代表XML文檔中的一個標簽,然后就可以在這個Element對象上添加屬性或進行其它的操作。

    ?3)createTextNode(String):用給定的字符串創建一個Text對象,Text對象代表了標簽或者屬性中所包含的純文本字符串。如果在一個標簽內沒有其它的標簽,那么標簽內的文本所代表的Text對象是這個Element對象的唯一子對象。

    4)getElementsByTagName(String):返回一個NodeList對象,它包含了所有給定標簽名字的標簽。

    5)getDocumentElement():返回一個代表這個DOM樹的根元素節點的Element對象,也就是代表XML文檔根元素的那個對象。

    7.Node對象所包含的主要的方法有

    ?appendChild(org.w3c.dom.Node):為這個節點添加一個子節點,并放在所有子節點的最后,如果這個子節點已經存在,則先把它刪掉再添加進去。

    ?getFirstChild():如果節點存在子節點,則返回第一個子節點,對等的,還有getLastChild()方法返回最后一個子節點。

    ?getNextSibling():返回在DOM樹中這個節點的下一個兄弟節點,對等的,還有getPreviousSibling()方法返回其前一個兄弟節點。

    ?getNodeName():根據節點的類型返回節點的名稱。

    ?getNodeType():返回節點的類型

    .getNodeValue():返回節點的值。

    ?hasChildNodes():判斷是不是存在有子節點。

    ?hasAttributes():判斷這個節點是否存在有屬性。

    ?getOwnerDocument():返回節點所處的Document對象。

    ?insertBefore(org.w3c.dom.Nodenew,org.w3c.dom.Noderef):在給定的一個子對象前再插入一個子對象。

    ?removeChild(org.w3c.dom.Node):刪除給定的子節點對象

    .replaceChild(org.w3c.dom.Nodenew,org.w3c.dom.Nodeold):用一個新的Node對象代替給定的子節點對象。

    ?NodeList對象,顧名思義,就是代表了一個包含了一個或者多個Node的列表?梢院唵蔚陌阉闯梢粋Node的數組,我們可以通過方法來獲得列表中的元素:

    ?getLength():返回列表的長度。

    ?item(int):返回指定位置的Node對象

    8Element對象代表的是XML文檔中的標簽元素,繼承于Node,亦是Node的最主要的子對象。在標簽中可以包含有屬性,因而Element對象中有存取其屬性的方法,而任何Node中定義的方法,也可以用在Element對象上面。

    ?getElementsByTagName(String):返回一個NodeList對象,它包含了在這個標簽中其下的子孫節點中具有給定標簽名字的標簽。

    ?getTagName():返回一個代表這個標簽名字的字符串。

    ?getAttribute(String):返回標簽中給定屬性名稱的屬性的值。在這兒需要注意的是,因為XML文檔中允許有實體屬性出現,而這個方法對這些實體屬性并不適用。這時候需要用到getAttributeNode()方法來得到一個Attr對象來進行進一步的操作

    ?getAttributeNode(String):返回一個代表給定屬性名稱的Attr對象。

    9.Attr對象代表了某個標簽中的屬性。Attr繼承于Node,但是因為Attr實際上是包含在Element中的,它并不能被看作是Element的子對象,因而在DOM中Attr并不是DOM樹的一部分,所以Node中的getparentNode(),getpreviousSibling()和getnextSibling()返回的都將是null。也就是說,Attr其實是被看作包含它的Element對象的一部分,它并不作為DOM樹中單獨的一個節點出現。這一點在使用的時候要同其它的Node子對象相區別

    SAX解析

    SAX的全稱是SimpleAPIsforXML,SAX提供的訪問模式是一種順序模式,這是一種快速讀寫XML數據的方式。當使用SAX分析器對XML文檔進行分析時,會觸發一系列事件,并激活相應的事件處理函數,應用程序通過這些事件處理函數實現對XML文檔的訪問,因而SAX接口也被稱作事件驅動接口。由于SAX分析器實現簡單,對內存要求比較低,因此實現效率比較高,對于那些只需要訪問XML文檔中的數據而不對文檔進行更改的應用程序來說,SAX分析器更為合適。

    SAX(SimpleAPIsforXML),面向XML的簡單APIs。使用DOM解析XML時,首先將XML文檔加載到內存當中,然后可以通過隨機的方式訪問內存中的DOM樹;SAX是基于事件而且是順序執行的,一旦經過了某個元素,我們就沒有辦法再去訪問它了,SAX不必事先將整個XML文檔加載到內存當中,因此它占據內存要比DOM小,對于大型的XML文檔來說,通常會使用SAX而不是DOM進行解析。

    SAX也是使用的觀察者模式(類似于GUI中的事件)

    圖中最上方的SAXParserFactory用來生成一個分析器實例。XML文檔是從左側箭頭所示處讀入,當分析器對文檔進行分析時,就會觸發在DocumentHandler,ErrorHandler,DTDHandler以及EntityResolver接口中定義的回調方法。

    4.SAX是事件驅動的,文檔的讀入過程就是SAX的解析過程。在讀入的過程中,遇到不同的項目,解析器會調用不同的處理方法。

    5.org.xml.sax.helpers.DefaultHandler類的方法

    6.SAX方式提取XML文檔內容信息示例


相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片