国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java與xml聯合之DOM編程

2019-11-17 04:04:40
字體:
來源:轉載
供稿:網友
DOM初步

  DOM是Document Object Model的縮寫,即文檔對象模型。前面說過,xml將數據組織為一顆樹,所以DOM就是對這顆樹的一個對象描敘。通俗的說,就是通過解析XML文檔,為XML文檔在邏輯上建立一個樹模型,樹的節點是一個個對象。我們通過存取這些對象就能夠存取XML文檔的內容。

  下面我們來看一個簡單的例子,看看在DOM中,我們是如何來操作一個XML文檔的。

  這是一個XML文檔,也是我們要操作的對象:

  

  

  Good-bye serialization, hello java!

  

  下面,我們需要把這個文檔的內容解析到一個個的Java對象中去供程序使用,利用JAXP,我們只需幾行代碼就能做到這一點。首先,我們需要建立一個解析器工廠,以利用這個工廠來獲得一個具體的解析器對象:

  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

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

  DocumentBuilder db = dbf.newDocumentBuilder();

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

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

  Document doc = db.parse("c:/xml/message.xml");

  DocumentBuilder的parse()方法接受一個XML文檔名作為輸入參數,返回一個Document對象,這個Document對象就代表了一個XML文檔的樹模型。以后所有的對XML文檔的操作,都與解析器無關,直接在這個Document對象上進行操作就可以了。而具體對Document操作的方法,就是由DOM所定義的了。
從上面得到的Document對象開始,我們就可以開始我們的DOM之旅了。使用Document對象的getElementsByTagName()方法,我們可以得到一個NodeList對象,一個Node對象代表了一個XML文檔中的一個標簽元素,而NodeList對象,觀其名而知其意,所代表的是一個Node對象的列表:

  NodeList nl = doc.getElementsByTagName("message");

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

  Node my_node = nl.item(0);

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

  String message = my_node.getFirstChild().getNodeValue();

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

  現在,既然我們已經能夠從XML文件中提取出數據了,我們就可以把這些數據用在合適的地方,來構筑應用程序。

  下面的內容,我們將更多的關注DOM,為DOM作一個較為詳細的解析,使我們使用起來更為得心應手。

  DOM詳解

  1.基本的DOM對象

  DOM的基本對象有5個:Document,Node,NodeList,Element和Attr。下面就這些對象的功能和實現的方法作一個大致的介紹。

  [[The No.5 Picture.]]

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

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

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

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

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

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

  Node對象是DOM結構中最為基本的對象,代表了文檔樹中的一個抽象的節點。在實際使用的時候,很少會真正的用到Node這個對象,而是用到諸如Element、Attr、Text等Node對象的子對象來操作文檔。Node對象為這些對象提供了一個抽象的、公共的根。雖然在Node對象中定義了對其子節點進行存取的方法,但是有一些Node子對象,比如Text對象,它并不存在子節點,這一點是要注意的。Node對象所包含的主要的方法有:

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

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

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

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

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

  getNodeValue():返回節點的值。

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

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

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

  insertBefore(org.w3c.dom.Node new,org.w3c.dom.Node ref):在給定的一個子對象前再插入一個子對象。

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

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

  NodeList對象,顧名思義,就是代表了一個包含了一個或者多個Node的列表。可以簡單的把它看成一個Node的數組,我們可以通過方法來獲得列表中的元素:

  GetLength():返回列表的長度。

  Item(int):返回指定位置的Node對象。

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

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

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

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

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

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

  需要說明的是,上面所說的DOM對象在DOM中都是用接口定義的,在定義的時候使用的是與具體語言無關的IDL語言來定義的。因而,DOM其實可以在任何面向對象的語言中實現,只要它實現了DOM所定義的接口和功能就可以了。同時,有些方法在DOM中并沒有定義,是用IDL的屬性來表達的,當被映射到具體的語言時,這些屬性被映射 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 拜城县| 峨边| 朝阳市| 大英县| 昂仁县| 丘北县| 富蕴县| 聊城市| 仁寿县| 秦安县| 虞城县| 丰都县| 南阳市| 桦川县| 乐东| 谷城县| 荆门市| 潼关县| 天峻县| 乐昌市| 壶关县| 霞浦县| 偃师市| 嘉禾县| 玉溪市| 安顺市| 岗巴县| 邛崃市| 石景山区| 中阳县| 伊吾县| 古蔺县| 北川| 开原市| 开远市| 临洮县| 印江| 广安市| 玉山县| 昌邑市| 太仓市|