標籤:

文檔對象模型(DOM

一、什麼是DOMDOM是Document ObjectModel的縮寫,是對XML文檔的內容進行表示的模型。它把XML文檔看作是一系列node和node間的關係,並且把每一個node都當作一個對象,所以叫文檔對象模型。DOM規範是W3C定義的,有三個Level:lLevel 1: 定義了絕大多數基礎功能lLevel 2: 增加定義了namespacelLevel 3: 對各個特性有了更好的支持DOM是與編程語言無關的,因此有多種實現,這裡的都是用Java的API(其他的我也不會),用的是Sun定義的標準JAXP(JavaAPI for XMLParsing),而JAXP僅僅是一個介面,它是調用其他的具體解析器來實現的。此外不是用JAXP的DOM實現還有JDOM和DOM4J。DOM將文檔中的所有都看作節點,因此定義了一個最基礎的介面是Node,它的字介面包括Element,Attr,Text等等,還包括了Document,也就是說DOM將整個文檔看作是一個節點。在Node中定義了很多方法,包括了讀取節點(getFirstChild(),getNextSibling(), getLastNode(), getChildNodes(), getNodeName(),getNodeType(), getNodue(), getParentNode(), getAttributes(),getOwnerDocuemt())、修改節點(insertBefore(), removeChild(),appendChild(), replaceChild(),setNodue()),這些方法都非常常用,但是沒有定義創建節點的方法,創建節點的方法是在它的子介面Document中定義的(createXXX()),也沒有定義按節點名字來得到節點的方法,這些方法是在Element和Document中定義的(getElementById(),getElementByTagName(), 注意在這裡按照名字直接得到的是Element)。DOM在解析文檔的時候按整個文檔的結構生成一棵樹,全部保存在內存中,這既產生了一些優點,也產生了一些缺點。優點就是整個文檔都一直在內存中,我們可以隨時訪問任何節點,並且對樹的遍歷也是比較熟悉的操作;缺點則是耗內存,並且必須等到所有的文檔都讀入內存才能進行處理。一個需要注意的地方就是,XML文檔兩個標籤之間的空白也是這棵樹的一個節點(Text節點)。二、DOM的API1、創建DocumentDocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse("abc.xml");創建一個文檔的過程是非常固定的,三步走。在這裡DocumentBuilderFactory有一些方法可以對我們的解析進行一定的控制,比如是否必須經過DTD或Schema驗證有效,是否忽略注釋,是否忽略namespace等等:factory.setValidating(true);factory.setIgnoringComments(true);factory.setNamespaceAware(true);2、瀏覽XML文檔的內容獲得Document後的第一步就是獲得root element,也叫document element:Element root = doc.getDocumentElement();這是Document最常用的方法之一,然而事實上直接調用getFirstChild()也可以得到。獲得根節點後就可以用各種各樣的getXXX()方法來進行瀏覽。有一個重要的問題是Attr不屬於任何節點的子節點,因此用getFirstChild(),getNextSibling(),getChildNodes()是無法得到它的,必須用專用的方法getAttributes(),getAttribute(String)單獨處理。3、修改XML文檔修改包含兩方面的內容,一方面是修改已有的,另一方面是創建新的節點加入到文檔中去。修改已有的節點值,只需要瀏覽到目標節點,然後調用Node.setNodue()就可以了,對Attr來說則是調用setValue();而修改已有的節點,則用replaceChild();刪除一個節點用removeChild()。創建新節點時,正如前面所說,是用Document來創建的。創建好後就可以使用append()或insertBefore()來插入到合適的地方。此外Attr總是比較特殊,為一個元素添加屬性需要用setAttribute()方法,而刪除屬性則要用removeAttribute()方法。4、返回值NodeList和NamedNodeMap在get方法中,有些方法返回一個節點列表,最多的是NodeList,而getAttributes()返回的是NamedNodeMap,幸好兩者完全像一個List,訪問的方法都是item(intindex)。5、輸出XML文檔前面的修改xml文檔只是在內存中修改了這棵樹,並沒有真正影響磁碟上的文件。要真正輸出到磁碟上,事實上和DOM沒什麼關係,而是用FileWriter或FileOutputStream輸出文檔為一個文件而已。然而有一點需要注意的是,在調用FileWriter.write()時,寫的不是Document對象,而是根元素對象:writer.write(root);此外通常需要創建一個新的xml文檔,DocumentBuilder的另一個方法是newDocument()可以創建一個新的文檔,然後自然可以創建一系列的節點,並聯結起來,形成一個完整的文檔,最後輸出。有一點值得奇怪的是,通常我們會需要在讀入一個文檔後,進行了瀏覽,做了一些修改,然後想要把這些修改也寫回到磁碟上,但是卻沒有直接寫回原文檔的方法,只能是使之輸出到一個同名文檔,覆蓋了原來的
推薦閱讀:

TechComm項目管理:如何制定Documentation Development Plan?
如何快速合併文檔?
道客巴巴-在線文檔分享平台遷墳方法
文檔
高級搜索使用說明文檔

TAG:文檔 | 模型 |