500 likes | 717 Views
第 9 章 XML DOM 物件的使用. 簡介 XML DOM 物件. 什麼是 DOM DOM 是 Document Object Model 的縮寫,譯為文件物件模型。 Document 物件的用途,在於以物件集合的方式,呈現出文件內容,並提供程式一個操作文件的程式介面,而這裡所謂的操作方式,大致上包含了節點的新增、刪除、修改、節點,以及在文件中搜尋節點 … 等動作。而 XML DOM 則是用於處理 XML 文件的文件物件模型。
E N D
簡介XML DOM物件 • 什麼是DOMDOM是Document Object Model的縮寫,譯為文件物件模型。Document物件的用途,在於以物件集合的方式,呈現出文件內容,並提供程式一個操作文件的程式介面,而這裡所謂的操作方式,大致上包含了節點的新增、刪除、修改、節點,以及在文件中搜尋節點…等動作。而XML DOM則是用於處理XML文件的文件物件模型。 • W3C的DOM標準1998年W3C公佈了DOM物件模型標準層級1的規格書(Document Object Model (DOM) Level 1 Specification Version 1.0)。該規格書定義了DOM介面內各種介面組(Interface Set)。整份文件包含兩個主要的部份,一是DOM核心部份(DOM Core),另一是HTML部份(DOM HTML)。
簡介XML DOM物件 • W3C的XML DOM與MSXML介面DOM Core中,亦運用樹狀結構表達XML文件中的資料,這個結構稱之為DOM Tree。以下為W3C中,DOM Tree所包含的元素。 • Document • Document Fragment • Document Type • Element • Attribute • Text • Entity • Entity Reference • Process Instruction • Comment • CDATA Section • Notation
簡介XML DOM物件 • MSXML實做的DOM物件,將以Document(IXMLDOMDocument)、Node(IXMLDOMNode)、NodeLists(IXMLDOMNodeLists)這三個介面,架構出整個DOM Tree,如下圖所示。
簡介XML DOM物件 • 下表為MSXML所實做之DOM與W3C標準的對照。
載入XML文件 - 建立Document物件與載入XML文件 • 在客戶端建立Document物件在客戶端用VBScript語言,建立Document物件的語法如下: Set 物件變數 = CreateObject("Msxml2.DOMDocument") • 在客戶端用JavaScript(JScript)語言建立Document物件的語法如下: 物件變數 = new ActiveXObject("Msxml2.DOMDocument")
載入XML文件 - 建立Document物件與載入XML文件 • 在伺服端建立Document物件在伺服端用VBScript語言,建立Document物件的語法如下: Set Document物件變數 = Server.CreateObject ("Msxml2.DOMDocument") • 在伺服端用JavaScript(JScript)語法建立Document物件的語法如下: 物件變數 = Server.CreateObject ("Msxml2.DOMDocument")
載入XML文件 - 載入XML文件 • 完成Document物件的建立後,將再利用Document物件的load()方法載入檔案,語法如下: Document物件.load(檔案路徑) • 以下敘述將使用VBScript語言,從伺服端載入book.xml檔。
載入XML文件 - 利用<XML>標籤載入XML文件 • 利用<XML>標籤於HTML網頁建立XML文件直接在HTML網頁中,運用<XML>標籤建立XML文件的語法如下: <XML id=物件變數名稱> XML文件 </XML> • 以下敘述將在HTML網頁內定義XML文件,並於Script語言中,運用objDOM變數引用。
載入XML文件 - 利用<XML>標籤載入XML文件 • 在HTML的Script中,欲取得XML文件的內容時,必須運用DOM物件的xml屬性,語法如下: DOM物件.xml • 以下敘述將把objDOM物件的文件內容設定給xmlcode物件的innerText屬性。
載入XML文件 - 利用<XML>標籤載入XML文件 • 利用<XML>標籤載入運用<XML>標籤從伺服端,載入XML文件的語法如下: <XML id=物件變數名稱 scr=檔案來源URL></XML>
載入XML文件 - 儲存XML文件 • 欲儲存XML文件時,可使用document物件的save()方法,語法如下: Document物件.save(儲存目標)
載入XML文件 - 取得XML文件中的節點 • 當XML文件被載入DOM物件後,將以樹狀結構呈現XML文件內的資料。在MSXML中,Document物件本身是一個代表XML文件的元素,也是建立XML文件時,必須第一個建立的物件。 • Document物件的documentElement屬性,則為XML文件的文件元素(Document Element)。每個元素若有下一層元素時,這些元素將被包含於一個節點集中,並可運用childNodes屬性引用。
載入XML文件 - 取得XML文件中的節點 • 在MSXML中,整份文件可表達如下:
載入XML文件 - 取得XML文件中的節點 • 以下語法將引用至XML文件的文件元素。 Document物件. documentElement • 以下敘述則取得文件元素下一層元素所組成的節點集。 Document物件. documentElement.childNodes • 若欲取得節點集中的元素時,可使用item()方法,語法如下: NodeLists物件.item(索引值)
載入XML文件 - 取得XML文件中的節點 • 以下敘述將取得文件節點下一層節點的第1個節點,objDOM物件變數將引用至某Document物件。 • 以下敘述將取得文件節點下第一層節點中,第1個節點的下一層節點中第2個節點,objDOM為一Document物件。
節點集的操作(NodeList介面)- 簡介NodeList介面 • 在DOM物件中,某節點若包含數個子節點時,透過childNodes屬性將可取得由節點所有子節點組成的節點集物件。 • 節點集物件的型態為DOM物件的NodeList介面,用於操作容納數個節點的節點集物件。
節點集的操作(NodeList介面)- 利用for迴圈輸出節點 • 欲輸出節點集中的節點時,可以利用for迴圈配合節點集的長度(也就是節點的個數),並利用NodeList物件的item()方法,依序取得節點集內的節點。 • 以下語法將取得節點集內節點的個數。 NodeList物件變數.length • 以下語法將取得節點集內的節點。 NodeList物件變數.item(索引值)
節點集的操作(NodeList介面)- 利用for迴圈輸出節點 • 以下敘述將取得節點集中所有節點,並以curNode引用。
節點集的操作(NodeList介面)- 利用for each迴圈輸出節點 • 在VBScript中,除了可以利用for迴圈外,還可以運用for each迴圈。在下面的for each迴圈中,將運用curNode做為引用childNodes內節點的變數。語法如下: for each 物件變數 In 節點集物件 …… next • 以下敘述將運用for each迴圈,列出節點集內的節點。
節點的操作(Nodes介面)- 簡介Node介面 • 在DOM物件的觀念中,XML文件內,不論是元素、屬性或元素的內容都被視為節點(Node)。 • Node介面在DOM物件內,是非常重要的介面。
節點的操作(Nodes介面)- 節點的取得 • Node物件提供了一些屬性,可以協助使用者,取得與引用節點相關的節點,說明如下表。
節點的操作(Nodes介面)- 節點的取得 • 各屬性所代表意義說明如下圖。
節點的操作(Nodes介面)- 節點的取得 • nodeName屬性依據不同類型的節點,傳回不同的資料,如:若節點類型為元素(Element),則會傳回標籤的名稱。 • text屬性傳回節點包含之所有節點的內容。 • xml屬性取得節點的內容,並包含節點的XML標籤。
節點的操作(Nodes介面)- 節點的類型 • 由於DOM物件的觀念中,在XML文件內,不論是元素、屬性或者元素的內容,都將被視為節點。 • 節點內容容納的是哪種類型的資料,可運用nodeType屬性取得。 • 欲取得代表節點型態的字串,可透過nodeTypeString屬性取得。
節點的操作(Nodes介面)- 運用XPath選取節點 • 選取單一節點欲選取單一節點時,可配合XPath語法,呼叫selectSingleNode()方法,即可從XML文件的某個節點下,選取出XPath指定的子節點。 Node物件變數.selectSingleNode(XPath敘述) • 回傳值為選取到的子節點物件,當XPath敘述可選取數個節點時,則將傳回第一個被選取到的節點。若未選取到任何子節點時,將傳回null值。
節點的操作(Nodes介面)- 運用XPath選取節點 • 以下敘述將選取documentElement節點下第1個book元素的tilte元素,並由selNode物件變數引用。
節點的操作(Nodes介面)- 運用XPath選取節點 • 選取數個節點若運用XPath語法選取出數個節點時,則必須呼叫selectNodes()方法,即可從XML文件中,選取出XPath指定的子節點。 Node物件變數.selectNodes(XPath敘述) • 回傳值為選取到的節點,所組成之節點集物件,若未選取到任何節點,則傳回一個空的節點集物件,在程式中,可判斷節點集的length屬性是否0,加以斷定。
節點的操作(Nodes介面)- 運用XPath選取節點 • 以下敘述將選取XML文件之文件元素下的所有book元素。 • 以下敘述則將利用XPath敘述,配合selectNodes()方法,篩選出XML文件中,isbn屬性為957-0462-42-6的book元素。
節點的操作(Nodes介面)- 運用元素標籤取得節點 • 若想取得XML文件內,某特定名稱的節點時,可以運用Document物件的getElementsByTagName()方法。語法如下: Document物件變數.getElementsByTagName (標籤名稱) • 回傳值為完成代表新元素的節點集物件。
節點的操作(Nodes介面)- 新增節點 • 利用DOM物件,將節點新增至XML文件的步驟如下: STEP 1、運用DOMDoocument物件的CreateElement()方法,建立欲新增的元素。 STEP 2、運用DOMDoocument物件的createTextNode()方法,建立包含欲新增元素之內容的文字節點。 STEP 3、呼叫節點物件(Node物件)的appendChild()方法,將於STEP 2完成建立的文字節點,加到STEP 1建立的元素。 STEP 4、從XML文件內,取得欲加入新節點的節點。 STEP 5、呼叫節點物件(Node物件)的appendChild()方法、insertBefore()方法或insertAfter()方法,完成節點的新增。
節點的操作(Nodes介面)- 新增節點 • DOMDocument物件createElement()方法以下是DOMDocument物件createElement()方法的語法說明: Document物件變數.createElement(標籤名稱) • 回傳值為完成代表新元素的節點物件。 • 以下敘述將建立名為penname的節點,並由objNewNode引用。
節點的操作(Nodes介面)- 新增節點 • DOMDocument物件createTextNode()方法以下是DOMDocument物件createTextNode()方法的語法說明: Document物件變數.createTextNode (內容字串) • 回傳值為完成代表文字節點的節點物件。 • 以下敘述將建立一個內容為『位元文化』的文字節點,並由objTextNode引用。
節點的操作(Nodes介面)- 新增節點 • Node物件appChild()方法以下是Node物件appChild()方法的語法說明: Node物件變數.appChild(節點物件) • 回傳值為新增至節點的節點物件。 • 以下敘述將把objTextNode新增至objNewNode,其中objTextNode與objNewNode均為引用至節點物件的變數。
節點的操作(Nodes介面)- 新增節點 • Node物件insertBefore()方法、insertAtfter()方法appendChild()方法僅是將新增的元素,加到特定元素所包含的最後一個子元素。若欲指定新增節點的位置,則必須運用insertBefore()方法或insertAfter()方法,將元素新增到參考節點之前或之後。兩方法的語法如下: Node物件變數.insertBefore (新增節點, 參考節點) Node物件變數.insertAfter (新增節點, 參考節點) • 回傳值為新增至XML文件的元素。 • 以下敘述將在objCurNode節點包含的第2個子節點前,插入objNewNode物件變數引用的節點。
節點的操作(Nodes介面)- 刪除節點 • 子節點的刪除從XML文件刪除某元素的子節點之步驟如下: STEP 1、取得欲刪除節點的上一層節點。 STEP 2、取得欲刪除的節點。 STEP 3、呼叫節點物件(Node物件)的removeChild()方法,將於STEP 2取得的節點,從STEP 1取得的節點中移除。
節點的操作(Nodes介面)- 刪除節點 • 以下是Node物件removeChild()方法的語法說明: Node物件變數.removeChild (節點物件) • 回傳值為被刪除的節點物件。 • 以下敘述將從objCurNode節點,移除objRmvNode代表的節點。
節點的操作(Nodes介面)- 刪除節點 • 配合XPath刪除節點欲一次刪除XML文件內的數個節點時,可以運用selectNodes()方法,配合XPath敘述選取欲刪除的節點,再運用NodeList物件的removeAll()方法,一次就將選取出的節點,從XML文件內刪除。 • 以下是removeAll()方法的語法: NodeList物件變數.removeAll • 無回傳值。 • 以下敘述將移除objNodeList節點集物件內所有節點。
節點的操作(Nodes介面)- 取代節點 • 以新節點取代XML文件內舊節點的步驟如下: STEP 1、運用DOMDoocument物件的CreateElement()方法,建立欲取代的新元素。 STEP 2、運用DOMDoocument物件的createTextNode()方法,建立欲取代舊元素之新元素的文字節點。 STEP 3、呼叫節點物件(Node物件)的appendChild()方法,將於STEP 2完成建立的文字節點,加到STEP 1建立的元素。 STEP 4、從XML文件內,取得欲取代子節點的節點。 STEP 5、呼叫節點物件(Node物件)的replaceChild()方法,完成節點的取代。
節點的操作(Nodes介面)- 取代節點 • 以下為執行節點取代動作的replaceChild()方法: Node物件變數.replaceChild (新節點, 舊節點) • 回傳值為被取代的舊節點。 • 以下敘述將把objCurNode節點包含的第2個子節點,取代為objNewNode引用的節點。
節點的操作(Nodes介面)- 節點屬性的取得、新增與刪除 • 屬性的取得欲取得節點的屬性時,可使用節點物件(Node物件)的getAttribute()方法。 Node物件變數.getAttribute(屬性名稱) • 回傳值為取得的屬性值字串,若屬性沒有被設定又沒有預設值,則傳回空字串(empty)。 • 以下敘述將取得objCurNode所引用節點,名為isbn的屬性值。
節點的操作(Nodes介面)- 節點屬性的取得、新增與刪除 • 若欲取得屬性節點時,則可呼叫getAttributeNode()方法,語法如下: Node物件變數.getAttributeNode(屬性名稱) • 回傳值為取得的屬性物件,若屬性沒有被設定又沒有預設值,則傳回null。
節點的操作(Nodes介面)- 節點屬性的取得、新增與刪除 • 屬性的刪除欲刪除節點的屬性時,可使用節點物件(Node物件)的removeAttribute()方法。 Node物件變數.removeAttribute(屬性名稱) • 沒有回傳值。 • 以下敘述將刪除objCurNode所引用節點的sale屬性。
節點的操作(Nodes介面)- 節點屬性的取得、新增與刪除 • 屬性的新增與修改欲新增節點的屬性時,可使用節點物件(Node物件)的setAttribute()方法。若新增的屬性已經存在,setAttribute()方法將修改指定屬性的值。 Node物件變數.setAttribute(屬性名稱, 屬性值) • 沒有回傳值。 • 以下敘述將為objSetAtt所引用節點,新增名為penname,值為『位元文化』的屬性。
節點的操作(Nodes介面)- 利用遞迴觀念輸出所有元素內容 • 遞迴觀念的實做方式,是在函數或副程式內,呼叫自己。直到符合某種條件後,才停止遞迴呼叫。 • 運用遞迴觀念,輸出XML文件中所有文字元素,邏輯是當欲輸出的元素是一個文字元素時(此類元素內將僅包含一個文字類型的節點),就進行元素內容的輸出。若輸出的不是一個文字元素,則進行遞迴呼叫。
節點的操作(Nodes介面)- 利用遞迴觀念輸出所有元素內容 • 以下ListNode函數運用遞迴觀念,輸出某元素下所有文字元素的內容,呼叫時傳入參數為欲輸出內容的元素。
節點的操作(Nodes介面)- 運用XSLT轉換文件 • 欲透過DOM物件將XSLT文件套用於XML文件,並執行轉換,可以運用Node物件的transformNode()方法與transformNodeToObject()方法完成。 • 呼叫transformNode()方法的語法如下: Node物件變數.transformNode (XSLT物件) • 回傳值為XML文件經過轉換後產生的字串
節點的操作(Nodes介面)- 運用XSLT轉換文件 • 以下敘述內objDOM將引用至欲被轉換的XML文件,objXSLDOM則引用至XSLT文件,呼叫transformNode()方法執行轉換後,將傳回XML文件轉換後的字串,再利用objNewDOM物件的loadXML()方法,將字串載入成為經過轉換的DOM物件。
節點的操作(Nodes介面)- 運用XSLT轉換文件 • 呼叫transformNodeToObject()方法的語法如下: Node物件變數.transformNodeToObject XSLT物件, 結果DOM物件 • 無回傳值。 • 在XSLT文件內,必須加上以下敘述取消XML文件的宣告,否則將無法正常呼叫transformNodeToObject()方法,執行轉換動作。 • 以下敘述內objDOM將引用至欲被轉換的XML文件,objXSLDOM則引用至XSLT文件,objNewDOM則為以轉換結果建立的DOM物件。
節點的操作(Nodes介面)- 運用XSLT轉換文件 • 呼叫transformNodeToObject()方法的語法如下: Node物件變數.transformNodeToObject XSLT物件, 結果DOM物件 • 無回傳值。 • 在XSLT文件內,必須加上以下敘述取消XML文件的宣告,否則將無法正常呼叫transformNodeToObject()方法,執行轉換動作。 • 以下敘述內objDOM將引用至欲被轉換的XML文件,objXSLDOM則引用至XSLT文件,objNewDOM則為以轉換結果建立的DOM物件。