2013年2月20日 星期三

DOM文件作業和XML文件互相轉換的java實作

級別: 入門

郭洪鋒 

2001 年 8 月 01 日
簡介︰該文簡要描述了 DOM 的概念和內部邏輯結構,提供了 DOM 文件作業和 XML 文件互相轉換的 java 實作過程。

1. DOM簡介

目前,W3C 已於2000年11月13日推出了規範 DOM level 2。文件物件模型(DOM)是 HTML 和 XML 文件的程式化介面規範,它與平台和語言是無關的,因而可以用各種語言在各種平臺上實作。該模型定義了 THML 和 XML 文件在記憶體中的邏輯結構(即為文件),提供了存取、存取 THML 和 XML 文件的方法。利用 DOM 規範,可以實作 DOM 文件和 XML 之間的相互轉換,巡訪、作業相應 DOM 文件的內容。可以說,要自由的操縱 XML 文件,就要用到 DOM 規範。


    回到頂端





2. DOM 內部邏輯結構

DOM 文件中的邏輯結構可以用節點樹的形式進行描述。透過對 XML 文件的解析處理,XML 文件中的元素便轉換為 DOM 文件中的節點物件。DOM 的文件節點有 Document、Element、Comment、Type 等等節點類型,其中每一個 DOM 文件必須有一個 Document 節點,並且為節點樹的根節點。它可以有子節點,或者葉子節點如 Text 節點、Comment 節點等。任何的格式良好的 XML 文件中的每一個元素均有 DOM 文件中的一個節點類型與之對應。利用 DOM 介面將 XML 文件轉換成 DOM 文件後,我們就可以自由的處理 XML 文件了。


    回到頂端





3. java 中的 DOM 介面

DOM 規範提供的 API 的規範,目前 Sun 公司推出的 jdk1.4 測試版中的 java API 遵循了 DOM level 2 Core 推薦介面的語義說明,提供了相應的 java 語言的實作。

在 org.xml.dom 中,jkd1.4 提供了 Document、DocumentType、Node、NodeList、Element、Text 等介面,這些介面均是存取 DOM 文件所必須的。我們可以利用這些介面建立、巡訪、修改 DOM 文件。

在 javax.xml.parsers 中,jkd1.4 提供的 DoumentBuilder和DocumentBuilderFactory 組合可以對 XML 文件進行解析,轉換成 DOM 文件。

在 javax.xml.transform.dom 和 javax.xml.transform.stream 中,jdk1.4 提供了 DOMSource 類別和 StreamSource 類別,可以用來將更新後的 DOM 文件寫入產生的 XML 文件中。



    回到頂端






4. 範例程式

4.1 將 XML 文件轉換成 DOM 文件

這個過程是獲得一個 XML 文件解析器,解析 XML 文件轉換成 DOM 文件的過程。

Jdk1.4中,Document介面描述了對應於整個XML文件的文件樹,提供了對文件資料的存取,是該步驟的目標。Document 介面可以從類別 DocumentBuilder 中取得,該類別含有了從 XML 文件獲得 DOM 文件實體的 API。XML 的解析器可以從類別 DocumentBuilderFactory 中取得。在 jdk1.4 中,XML 文件轉換成 DOM 文件可以有如下程式碼實作︰
//獲得一個 XML 文件的解析器

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

//解析 XML 文件產生 DOM 文件的介面類別,以便存取 DOM。

DocumentBuilder builder = factory.newDocumentBuilder();

document = builder.parse( new File(FileName) );



4.2 巡訪 DOM 文件

獲得介面類別 document 實體後,可以對 DOM 的文件樹進行存取。要巡訪 DOM 文件,首先要獲得 Root 元素。然後獲得 Root 元素的子節點清單。這裡透過遞迴的方法實作巡訪的目的。
//獲得 Root 元素

Element element = document.getDocumentElement();

//獲得 Root 元素的子節點清單

nodelist = element.getChildNodes();

//用遞迴方法實作 DOM 文件的巡訪

GetElement(nodelist);

其中 GetElement 方法實作如下︰

    public void GetElement(NodeList nodelist){

    Node        cnode;

    int     i,len;

    String  str;

    

    if(nodelist.getLength() == 0){

        // 該節點沒有子節點

        return;

    }

    for(i=0;i 1)

                System.out.println("      "+str+" "+len);

        }

    }

    }



4.3 修改DOM文件

修改 DOM 文件的 API 在 DOM level 2 Core規範中做了說明,jkd1.4 中的 org.xml.dom 中實作了這些 API。修改 DOM 文件作業主要集中在 Document、Element、Node、Text 等類別中,這裡給出的例子中是在解析出的 DOM 文件中增加一系列物件,對應與在 XML 文件中增加一條記錄。
// 獲得 Root 物件

    Element root = document.getDocumentElement();

// 在 DOM 文件中增加一個 Element 節點

    Element booktype = document.createElement("COMPUTES");

//將該節點轉換成 root 物件的子節點

    root.appendChild(cdrom);

//在 DOM 文件中增加一個 Element 節點

    Element booktitle = document.createElement("Title");

//將該節點轉換成 booktype 物件的子節點

    booktype.appendChild(booktitle);

//在 DOM 文件中增加一個 Text 節點

    Text bookname = document.createTextNode("understand Corba");

//將該節點轉換成 bookname 物件的子節點

booktitle.appendChild(bookname);



4.4 將 DOM 文件轉換成 XML 文件
// 獲得將 DOM 文件轉換為 XML 文件的轉換器,在 jdk1.4 中,有類別 TransformerFactory

// 來實作,類別 Transformer 實作轉換 vPI。

            TransformerFactory tfactory = TransformerFactory.newInstance();

            Transformer transformer = tfactory.newTransformer();

// 將 DOM 物件轉換為 DOMSource 類別物件,該物件表現為轉換成別的表達形式的訊息容器。

            DOMSource source = new DOMSource(document);

// 獲得一個 StreamResult 類別物件,該物件是 DOM 文件轉換成的其它形式的文件的容器,可以是 XML 文件,純文字文件,HTML 文件。這裡為一個 XML 文件。

            StreamResult result = new StreamResult(new File(“text.xml”));

// 呼叫 API,將 DOM 文件轉換成 XML 文件。

            transformer.transform(source,result);




這裡提供了該範例程式的 完整程式 ,該範例程式已在 windows 2000中jdk1.4環境中測試過。

以上提供了一個例子,讀者可以從中瞭解到對 DOM 作業的思路。因為對 DOM 的作業均遵循了 DOM 規範,所以也適用於其它語言對 DOM 的處理。


    回到頂端





參考資料


Java 2 Platform, Standard Edition, V1.4.0 API Specificaion


    回到頂端





關於作者

    
郭洪鋒︰主要從事 UNIX 系統下分散式應用的開發和研究。您可以透過電子郵件 ghf_email@sohu.com 和他連絡。

沒有留言: