曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
包含輸入和輸出功能。當討論D O M在服務器端的應用時,我們將看到如何使用純粹的D O M
Level 1功能產生X M L文件。
我們將d i v R a w X M L元素的文本(位于文件底部)設置為普通的文本輸出。然后,我們使用
樣式表將X M L文檔轉化為可讀性更強的輸出。第9章將詳細介紹X S L。
最后,我們列出了三個內嵌的樣式表,以及H T M L 頁面的其余部分,其中包含
r e n d e r E l e m e n t ( )函數涉及的D I V元素:
程序清單5 - 1 3
第5章文檔對象模型使用131 下載
132使用XML 高級編程
下載
通過這種方式在客戶端創建的X M L文檔能夠傳回服務器端進行操作,雖然這超出了本例的
討論范圍。最簡單的方法是設置輸入元素,它通常是隱含的,它的值是文檔的x m l屬性的值;當
表單被提交時,這些信息將成為提交元素的一部分。如果客戶端的X M L文檔過大,不適于作為
表單的一部分提交,可以考慮其他方式,例如: F T P,使用Posting Acceptor 的H T T P,其他
H T T P文件提交程序,x m l h t t p事務(M i c r o s o f t特有的結構),或者M i c r o s o f t的S O A P協議(第1章
討論了S O A P協議)等。
5.3.2 更復雜的編程實例
下面讓我們看看如何將D O M應用于服務器端。我們將構建一個A S P頁面,它通過P o s t i n g
A c c e p t o r接收客戶端提交的固定寬度的文本文件,然后解析文件并使用D O M建立數據島,最后
將結果發送回客戶端。
1. 使用D O M根據文本創建X M L文檔
在這個例子中,用戶不必通過H T M L頁面輸入圖書的數據,我們已經有代表圖書的固定寬度
的文本文件。假設它已經通過某種機制( F T P、Posting Acceptor或其他任何方法)上載到服務
器的/ u p l o a d s目錄。A S P頁面將解析上載的文件,在H T M L頁面中產生數據島,并將頁面發送回
客戶端供用戶查看。
你可以通過Wr o x的We b站點h t t p : / / w w w. w r o x . c o m獲得本節實例的代碼文件。
我們將提交的圖書文件如下:
程序清單5 - 1 4
第5章文檔對象模型使用133 下載
這是一個固定寬度的文件,許多遺留的系統仍然使用這類文件導出數據。文件的第一行包
含書名、出版商和出版日期;第二行包含書的價格和I S B N號;第三行是書的摘要。文件的其余
部分列出了書的作者(以字母A開頭的行)和類別(以字母C開頭的行)。在實際應用中,產生
該文件的系統還應該提供用于描述文件格式和內容的文檔。
我們將使用下面的表單B o o k F o r m . h t m請求解析該文件:
程序清單5 - 1 5
D i s p l a y B o o k . a s p文件如下:
為了能夠在客戶端看到利用樣式表顯示的結果,我們將使用前一節介紹的客戶端實例中的
renderElement() JScript函數;然而,在本例中最重要的是如何解析文件。一旦解析了文件,就
很容易將它存儲在關系數據庫中,或者以其他形式保存。
程序清單5 - 1 6
下面,我們將實現幾個輔助性子例程。第一個是A d d E l e m e n t To P a r e n t ( ),它將指定的元素和
值添加到指定的D O M中特定的父元素中:
程序清單5 - 1 7
134使用XML 高級編程
下載
第二個輔助子例程用于從D O M產生X M L流。需要說明的是, D O M的某些實現,例如:
M i c r o s o f t提供的實現,包含了用于產生這個文本的屬性,然而由于這并不是Level 1要求的功能,
因此你使用的D O M實現可能不提供該屬性,為此,必須使用如下子例程。另外,大多數節點類
型,例如:屬性、注釋等,是我們的例子無法處理的。我們將在后面重新分析這段代碼,說明
如何導出其他節點類型。但是現在,這個子例程只能處理e l e m e n t和t e x t節點類型:
程序清單5 - 1 8
程序中的遞歸用于產生文件中的嵌套標記—當使用遞歸時,你應該特別注意堆棧問題。
然而,對于大多數X M L文檔,這種技術是恰當的。
實際上,真正的文件解析操作是在將包含X M L的數據島中執行的。一旦解析完畢,就可以
利用R e s p o n s e . Wr i t e生成X M L(在Wr i t e N o d e X M L ( )過程中),它將創建H T M L中的數據島,這個
H T M L文件將返回給客戶端:
程序清單5 - 1 9
第5章文檔對象模型使用135 下載
在本例中,我們將文件名硬編碼—但是在實際環境中,文件應該來自Posting Acceptor或
其他源:
然后,我們創建Microsoft XML DOM對象的實例,并將它設置為同步操作:
下面,我們創建B o o k元素,并將它添加到新文檔中:
現在,我們將打開文件,并開始解析:
對于與圖書相關的每條常規信息,我們使用A d d E l e m e n t To P a r e n t ( )子例程將適當的子元素添
加到B o o k元素中。該子例程將根據標記名稱和數據創建元素節點和文本節點,并將它們鏈接到
一起,添加到指定的父節點中:
程序清單5 - 2 0
136使用XML 高級編程
下載
現在,文件中未處理的行分別對應于A u t h o r元素和C a t e g o r y元素。文件的第一列指示了哪些
代表作者,哪些代表類別—A表示作者,C表示類別。首先,我們需要產生R e c S u b j C a t e g o r i e s
和A u t h o r s容器元素,并將它們添加為B o o k元素的子節點:
程序清單5 - 2 1
下面,我們將讀取文件的剩余行。對于每一行,先確定它是類別還是作者,然后將它添加
為適當容器元素的子節點:
程序清單5 - 2 2
下面,我們將向應答串中寫入純X M L。由于我們的代碼是在數據島中執行的,因此寫入的
數據將嵌在數據島中:
程序清單5 - 2 3
下面的三個樣式表和H T M L代碼片段選自第一個例子。唯一的變化是B O D Y元素現在包含
o n l o a d事件,它將使用三個樣式表展示X M L數據島:
程序清單5 - 2 4
第5章文檔對象模型使用137 下載
138使用XML 高級編程
下載
D i s p l a y B o o k . a s p文件將產生如圖5 - 9所示的輸出。
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(54)