【正文】
好 XML 元素的相關(guān)物件後,我們可以使用 Node 節(jié)點(diǎn)物件的相關(guān)方法將節(jié)點(diǎn)新增到樹(shù)狀結(jié)構(gòu)的 XML DOM 中,相關(guān)方法的說(shuō)明如下所示: ? appendChild(newnode) : 新增 newnode 節(jié)點(diǎn)為其最後一個(gè)子節(jié)點(diǎn)。 (/+())。 ? 由於 getElementsByTagName() 回傳一個(gè)由 Element 物件所組成的 NodeList,因此可以使用 getTagName() 方法取得標(biāo)籤名稱 ? Element 物件還提供 getAttribute() 方法取得XML 元素的指定屬性值,如下所示: ? (i).getAttribute(code) ? Note: Element 也是 Node 的子類別 Text 內(nèi)容節(jié)點(diǎn)物件 ? Text 物件指的為 XML 元素的文字內(nèi)容。例如:使用 for 迴圈顯示所有NodeList 物件的節(jié)點(diǎn),如下所示: NodeList nodes = ()。 i=num。 // 取得所有子節(jié)點(diǎn) for (int i=0。 case 3: return 內(nèi)容: + ().trim()。 child != null。 //(true)。 } }} 範(fàn)例: ?xml version= encoding=Big5? ! 文件範(fàn)例 : !DOCTYPE library SYSTEM library ![CDATA[ script type=text/javascript function hello() { alert(Hello World)。 (false)。 Ch10_5_1 import .*。 …… } catch(SAXException se) { ()。 import .*。 ? 支援多種文件驗(yàn)證 ?DOM 支援 DTD、 XML Schema 等 XML 文件驗(yàn)證。 especially when backward traversal is necessary. 什麼是 DOM ? 「 DOM」( Document Object Model)物件模型可以將一份結(jié)構(gòu)化文件轉(zhuǎn)換成一棵由節(jié)點(diǎn)( Nodes)組成的樹(shù)狀結(jié)構(gòu),提供節(jié)點(diǎn)的相關(guān)屬性和方法來(lái)存取元素內(nèi)容,或新增、刪除和修改節(jié)點(diǎn)內(nèi)容,如下圖所示: 什麼是 W3C DOM ? DOM 是 W3C 建議規(guī)格 ?Designed with language independence ? DOM Level 1 在 1998 年 10 月 1 日成為 W3C 的建議規(guī)格, DOM Level 2 是在2020 年 11 月成為建議規(guī)格,目前最新版本是 Level 3 W3C DOM的特點(diǎn) ? 跨平臺(tái)和程式語(yǔ)言的程式介面 ? 支援多種結(jié)構(gòu)化文件 ?W3C DOM 支援 HTML 和 XML 文件 ? 支援多種程式語(yǔ)言 ?JavaScript、 VBScript、 Perl、 Visual Basic、Delphi、 C++、 PHP 和 Java 等程式語(yǔ)言。 JAXP API 的相關(guān)套件 ? JAXP API 提供 DOM 和 SAX 剖析和驗(yàn)證的常用套件,如下表所示: 套件 說(shuō)明j av ax . x m l .pars er s 提供與開(kāi)發(fā)廠商無(wú)關(guān)的通用 A PI 來(lái)使用 DOM 和 SA X剖析和驗(yàn)證 X ML 文件j av ax . x m l .transform 提供處理 X SL T 轉(zhuǎn)換的相關(guān)類別j av ax . x m l .val i d a t i o n J A X P 1. 3 版新增的套件 ,支援 X ML Sc h em a 驗(yàn)證 X ML文件o r g .xm l .sax 定義基礎(chǔ)的 SA X A PI 介面 ,提供事件剖析 X ML 文件的 A PIo r g .xm l .sax . h el p er s 提供一些現(xiàn)成類別 ,可以幫助程式設(shè)計(jì)者更容易使用SA X A PIo r g .w 3 c. d o m 提供支援 DOM 文件的套件 ,即 D o c u m en t 物件DOM API說(shuō)明 ? JAXP API 的 DOM API( Document Object Model API)是使用 套件的 DocumentBuilderFactory 類別來(lái)取得DocumentBuilder 實(shí)例,以便建立 DOM 樹(shù)狀結(jié)構(gòu)節(jié)點(diǎn)的 Document 物件,如下圖所示: DOM API介面物件 ? 將 XML 文件內(nèi)容視為一個(gè)樹(shù)狀結(jié)構(gòu)的節(jié)點(diǎn),其主要的介面物件,如下表所示: D OM 介面物件 說(shuō)明D ocu m ent 樹(shù)狀結(jié)構(gòu)表示整份 XM L 文件N od e 節(jié)點(diǎn)物件 ,新增 、刪除和修改節(jié)點(diǎn)的物件N od eL ist 節(jié)點(diǎn)清單物件 ,就是指定節(jié)點(diǎn)子節(jié)點(diǎn)的整個(gè)樹(shù)狀結(jié)構(gòu)E lem ent X ML 元素物件 ,也就是元素節(jié)點(diǎn)T ext X ML 元素內(nèi)容物件 ,也就是內(nèi)容節(jié)點(diǎn)N a m edNode Ma p 元素節(jié)點(diǎn)的屬性集合載入與剖析 XML文件檔案 ? 在 Java 程式載入與剖析 XML 檔案,首先需要匯入 JAXP API 的相關(guān)套件,如下所示: import .*。 Document document = (new File(filename))。 ?參數(shù) true 表示 XML 剖析器需要驗(yàn)證 XML 文件,預(yù)設(shè)是 DTD 驗(yàn)證;如果設(shè)為 false,剖析器就不會(huì)進(jìn)行文件驗(yàn)證。 (false)。 (())。 DocumentBuilderFactory dbf = ()。 請(qǐng)觀察設(shè)定有無(wú)的差異! Ch10_3_1 修改版 // 取得這一層的所有節(jié)點(diǎn) for ( 。 switch(type) { case 1: return 元素: + ()。 } } Ch10_3_1 修改版 // 顯示子節(jié)點(diǎn)的遞迴方法 private static void pChild(Node temp,int pos) { if ( () ) { NodeList nodes = ()。 for (int i=0。 ? 在 NodeList 物件的 getLength() 方法可以取得共擁有多少個(gè)節(jié)點(diǎn)。 ? ((i).getTagName())。 ( + +())。 ?程式碼使用 createElement() 方法建立 Element 元素物件 book,這就是新文件的根元素。 新增 XML元素和屬性 步驟四 第四步:新增元素的屬性 ? 在 XML 節(jié)點(diǎn)如果擁有屬性, Element 元素物件可以使用 setAttribute() 方法建立屬性,如下所示: (instock, Y)。 (n)。 public class Ch10_4_4 { static Document document。 ((P761))。 // 新增屬性 node=(Element)().getNextSibling()。 printXML(root)。 for (int j = 0。 for ( int i=0。 ( + +())。 import .*。 (Parser名稱 : + ().getName())。 (Root node: + ())。 // never fet this! DocumentBuilder builder = ()。 import 。 // 利用 XPathFactory 產(chǎn)生 XPath 物件 XPath xpath = ()。 } }} 練習(xí)題 ? 請(qǐng)完成第六章的練習(xí):請(qǐng)找出所有非英文的書(shū)籍並以條列示的方式列印出書(shū)籍的名稱以及價(jià)格。 // 建立 Transformer物件 Transformer tf = (new StreamSource(xsltFile))。 String strLine。 // 建立 Transformer物件 // 若不指定任何 xsltFile,則不做任何轉(zhuǎn)換,而直接輸出 //Transformer tf = ()。 Transformer tf = (new StreamSource(xsltFile))。 Ch10Print app = new Ch10Print()。 安裝 Tomcat ? 安裝 JDK 版 ?設(shè)定環(huán)境變數(shù) JAVA_HOME 指向 JDK 的安裝目錄 ? ex. set JAVA_HOME=c:\jdk ? 安裝 Tomcat ?下載點(diǎn) ?請(qǐng)下載 zip 檔並將它解壓縮到 d:\(或者 c:\) ?為了減少 typing,將目錄名稱從 apachetomcat 改成 tomcat 測(cè)試 Tomcat ? 開(kāi)啟 ”命令提示字元 ”,並 cd 到 d:\tomcat\bin ? 執(zhí)行 .\ ? 你將會(huì)看到一連串的訊息 ? 開(kāi)啟你喜歡的瀏覽器,並輸入 ? 0/ ? 如果你的結(jié)果如右圖,表示你的安裝成功 ? 你也可以在進(jìn)一步測(cè)試一下 tomcat 提供的 JSP 和 servlet 的範(fàn)例 JSP 的架構(gòu) C l i e n tC l i e n tC l i e n tI n t e r n e tW e b S e r v e rT o m c a t( S e r v l e tE n g i n e )H t t p S e r v l e t Re q u e s tH t t p S e r v l e t Re s p o n s eS e r v l e t / J S Prequest out JSP 程式環(huán)境設(shè)定 ?建立一個(gè)目錄 ? mkdir d:\tomcat\webapps\xml ? xml 為 project 名稱 ? JSP 程式和 xml 檔都放在這個(gè)目錄 ? JDBC 等共用程式庫(kù)可以放在 d:\tomcat\lib,或者 ?給 xml 這個(gè)專案用的,可以放在 d:\tomcat\webapps\xml\WEBINF\lib 第一個(gè) JSP ! html head titleHello World/title /head ! HTML 碼與程式碼交叉出現(xiàn);程式碼 % % 成對(duì) body ! 宣告變數(shù) s % String s = Eric。charset=Big5 titleHello Form/title /head body form method=post action= Hours: input type=text value=45 name=data input type=submit /form /body /html 第三個(gè) JSP % page language=java contentType=text/html。 private void pChild(Node temp,int pos, StringBuffer buf) { if ( () ) { NodeList nodes = ()。 if ( val != null ) { printIndent(pos, buf)。 i++) ()。 // 讀取 File file = new File(getServletContext().getRealPath(/)+/+filename)。 pChild(child, 0, buf)。