從XML生成可與Ajax共同使用的JSON_第1頁(yè)
從XML生成可與Ajax共同使用的JSON_第2頁(yè)
從XML生成可與Ajax共同使用的JSON_第3頁(yè)
從XML生成可與Ajax共同使用的JSON_第4頁(yè)
從XML生成可與Ajax共同使用的JSON_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、從 XML 生成可與 Ajax 共同使用的 JSON時(shí)下,非常流行使用 JavaScript 代碼為數(shù)據(jù)驅(qū)動(dòng)的 Web 應(yīng)用程序添加互動(dòng)性。若能將數(shù)據(jù)編碼成 JavaScript Object Notation(JSON)的格式,您就可以更輕松地通過(guò) JavaScript 語(yǔ)言使用它。通過(guò)本文,發(fā)掘使用 XSLT V2 從 XML 數(shù)據(jù)生成 JSON 的幾種不同方法。幾年前,許多開(kāi)發(fā)人員很看好 XML、XSLT、Extensible HTML (XHTML)和其他一些基于標(biāo)記的語(yǔ)言。現(xiàn)在,Asynchronous JavaScript and XML(AJAX)成了新的熱點(diǎn),人們又將目光轉(zhuǎn)向了

2、使用 JavaScript 代碼的數(shù)據(jù)驅(qū)動(dòng)的富 Internet 應(yīng)用程序。但是開(kāi)發(fā)人員是否已經(jīng)消除了 XML 和這一新技術(shù)之間的鴻溝呢?當(dāng)然,您可以在 Web 客戶(hù)機(jī)中使用 XML 解析器來(lái)讀取數(shù)據(jù),但這種做法會(huì)帶來(lái)兩個(gè)問(wèn)題。第一,出于安全方面的原因,XML 數(shù)據(jù)只能從與此頁(yè)面相同的那個(gè)域中讀取。這雖然不是什么大的限制因素,但它的確會(huì)引起部署方面的問(wèn)題,還會(huì)阻礙 DHTML 小部件的創(chuàng)建。第二,讀取和解析 XML 會(huì)非常慢。另一種做法是讓服務(wù)器執(zhí)行 XML 的解析工作,方法是設(shè)置服務(wù)器,使之向?yàn)g覽器發(fā)送以 JavaScript 代碼或時(shí)下流行的 JavaScript Object Notat

3、ion(JSON)編碼的數(shù)據(jù)。本文將展示如下三種使用 XSLT V2 語(yǔ)言和 Saxon XSLT V2 處理器從 XML 數(shù)據(jù)生成 JSON 的技巧: 簡(jiǎn)單編碼 通過(guò)函數(shù)調(diào)用加載數(shù)據(jù) 編碼對(duì)象 JSON 簡(jiǎn)介要學(xué)習(xí)如何將數(shù)據(jù)編碼成 JSON(它只是 JavaScript 的一個(gè)子集),最好的方法是從數(shù)據(jù)開(kāi)始。清單 1 顯示了書(shū)籍列表的一個(gè)示例 XML 數(shù)據(jù)集。清單 1. 基本的圖形化圖書(shū)館Jack Herrington Manning Jack Herrington O'Reilly Jack Herrington O'Reilly 這個(gè)數(shù)據(jù)集很簡(jiǎn)單,只包含三本書(shū),每本書(shū)都具

4、有惟一的 ID、書(shū)名、作者姓名及出版商的名字。(沒(méi)錯(cuò),我只選擇了我自己的書(shū)作為數(shù)據(jù)集,但能怨我嗎?這些書(shū)實(shí)在是不可多得的節(jié)日和生日禮物。)清單 2 顯示了這些數(shù)據(jù)在 JSON 中的效果。清單 2. JSON 中的示例數(shù)據(jù)集 id: 1,title: 'Code Generation in Action',first: 'Jack',last: 'Herrington',publisher: 'Manning' ,. 方括號(hào) ( 表明這是一個(gè)數(shù)組。大括號(hào) ( 則表明這是一個(gè)散列表,該散列表由一組名稱(chēng)和值對(duì)組成。在本例中,我創(chuàng)建了一個(gè)

5、散列表的數(shù)組 用來(lái)存儲(chǔ)這類(lèi)結(jié)構(gòu)式數(shù)據(jù)的一種常見(jiàn)方法。另外一點(diǎn)值得注意的是字符串是通過(guò)單引號(hào)或雙引號(hào)被編碼的。所以,如果我想用單引號(hào)編碼 O'Reilly,我就必須使用反斜杠對(duì)它進(jìn)行轉(zhuǎn)義:'O'Reilly'。 這讓我編寫(xiě)的這個(gè) XSLT 樣式表更為有趣了一些。我并未在本例中放上任何日期,但您也可以通過(guò)如下兩種方法來(lái)編碼日期。第一種方法是將日期作為字符串,該字符串必須在后面被解析。第二種方法是將日期作為一個(gè)對(duì)象,比如:publishdate: new Date( 2006, 6, 16, 17, 45, 0 這段代碼將 publishdate 的值設(shè)置為6/16/

6、2006 5:45:00 p.m.。簡(jiǎn)單編碼接下來(lái)我將陸續(xù)介紹 JSON 編碼的幾種技巧。第一種也是其中最簡(jiǎn)單的一種,此樣式表如 清單 3 所示。清單 3. simple.xsl 樣式表xmlns:xsl="/1999/XSL/Transform" version="2.0"xmlns:js="">var g_books = , id: ,name: ' ',first: ' ',last: ' ',publisher: ' '要理解

7、此樣式表,不妨先來(lái)看一下 清單 4 所示的輸出。清單 4. simple.xsl 的輸出var g_books = id: 1,name: 'Code Generation in Action',first: 'Jack',last: 'Herrington',publisher: 'Manning', id: 2,name: 'PHP Hacks',first: 'Jack',last: 'Herrington',publisher: 'O'Reilly',

8、 id: 3,name: 'Podcasting Hacks',first: 'Jack',last: 'Herrington',publisher: 'O'Reilly'這里,我將名為 g_books 的變量設(shè)置為一個(gè)包含三個(gè)散列表的數(shù)組,每個(gè)散列表包含關(guān)于該書(shū)的信息。再回過(guò)頭來(lái)看看 清單 3,您會(huì)發(fā)現(xiàn)第一個(gè)模板匹配 "/" 路徑,它也是首先應(yīng)用到輸入數(shù)據(jù)集的模板,該模板使用 for-each 循環(huán)來(lái)遍歷每本書(shū)。之后,它使用 標(biāo)記來(lái)將文本從該數(shù)據(jù)輸出到 JavaScript 輸出代碼。對(duì)于字符串,我使

9、用名為 js:escape( 的定制函數(shù),它在模板之前定義。該函數(shù)使用一個(gè)正則表達(dá)式將一個(gè)單引號(hào)標(biāo)記更改為帶有反斜杠的單引號(hào)標(biāo)記。最后一個(gè)重要的元素是 標(biāo)記,它告知處理器要輸出的是文本而不是 XML。要檢驗(yàn)此過(guò)程是否可以正常工作,我加入了一個(gè) simple .html 文件,該文件引用我在 simple.js 保存的 XSL 樣式表的輸出。這個(gè) HTML 文件如 清單 5 所示。清單 5. simple.html 文件.html 文件使用 稍后將詳細(xì)介紹 drawbooks 函數(shù)。這里重要的是了解一下頁(yè)面如何定義 AddBooks 函數(shù),該函數(shù)隨后會(huì)由 function1.js 文件中的腳本調(diào)

10、用。該 AddBooks 函數(shù)負(fù)責(zé)處理數(shù)據(jù)。而且被調(diào)用的 AddBooks 函數(shù)會(huì)向頁(yè)面指示 .這里更改了 XSLT,以使函數(shù)調(diào)用駐留在 for-each 循環(huán)體內(nèi)。清單 12 顯示了更新后的樣式表。清單 12. function2.xsl.AddBook( id: ,name: ' ',first: ' ',last: ' ',publisher: ' ' ;.對(duì)這個(gè)給定示例來(lái)說(shuō),這種更改看起來(lái)有些隨意。但如果原始的 XML 數(shù)據(jù)集有多種數(shù)據(jù)類(lèi)型,要為每種類(lèi)型分配一個(gè)單獨(dú)的函數(shù)調(diào)用會(huì)使 XSL 和頁(yè)面上的 JavaScript

11、代碼更為簡(jiǎn)單、更易于維護(hù)。編碼對(duì)象對(duì)小的頁(yè)面來(lái)講,使用 JavaScript 函數(shù)沒(méi)有問(wèn)題。但對(duì)于大型項(xiàng)目,就需要使用 JavaScript 語(yǔ)言的一些面向?qū)ο筇匦浴J堑?,JavaScript 語(yǔ)言可以處理對(duì)象而且可以處理得很好。清單 13 顯示了如何創(chuàng)建帶有數(shù)據(jù)的對(duì)象。清單 13. Object1.jsg_books.push( new Book( id: 1,name: 'Code Generation in Action',first: 'Jack',last: 'Herrington',publisher: 'Manning

12、9; ;g_books.push( new Book( id: 2,name: 'PHP Hacks',first: 'Jack',last: 'Herrington',publisher: 'O'Reilly' ;在本例中,我只簡(jiǎn)單地向名為 g_books 的數(shù)組添加了 Book 對(duì)象。JavaScript 的對(duì)象創(chuàng)建與 Java、C# 或 C+ 編程語(yǔ)言的對(duì)象創(chuàng)建十分相似。都是一個(gè) new 操作符后跟一個(gè)類(lèi)名。參數(shù)放到隨后的括號(hào)內(nèi)。在本例中,我傳入了一個(gè)帶值的單一散列表,并將其分割成單獨(dú)的一些參數(shù)。創(chuàng)建此對(duì)象的代碼如

13、清單 14 所示。清單 14. Object1.xslg_books.push( new Book( id: ,name: ' ',first: ' ',last: ' ',publisher: ' ' ;此頁(yè)面內(nèi)最值得注意的是定義 Book 類(lèi)的那部分代碼。清單 15 顯示了該頁(yè)面。清單 15. object1.html.Book 類(lèi)的構(gòu)造函數(shù)循環(huán)訪問(wèn)散列表的所有數(shù)據(jù)。對(duì)于每個(gè)鍵,會(huì)在對(duì)象上創(chuàng)建一個(gè)具有對(duì)象名稱(chēng)和數(shù)據(jù)的實(shí)例變量。不需要對(duì) drawbooks 函數(shù)做任何修改,因?yàn)閷?duì)象都有與原始的散列表相同的鍵和值。JavaScri

14、pt 語(yǔ)言并不區(qū)分訪問(wèn)的是散列表內(nèi)的命名值還是對(duì)象上的命名值。當(dāng)然,Book 類(lèi)應(yīng)該有像 set 和 get 這樣的訪問(wèn)程序。 清單 16 顯示了我是如何對(duì) JavaScript 數(shù)據(jù)進(jìn)行編碼的。清單 16. Object2.jsvar b1 = new Book(;b1.setId ( 1 ;b1.setTitle ( 'Code Generation in Action' ;b1.setFirst ( 'Jack' ;b1.setLast ( 'Herrington' ;b1.setPublisher ( 'Manning'

15、;g_books.push( b1 ;var b2 = new Book(;b2.setId ( 2 ;b2.setTitle ( 'PHP Hacks' ;.沒(méi)錯(cuò),這有些大同小異。它也是先創(chuàng)建一個(gè)對(duì)象,設(shè)置其值,然后將它添加到數(shù)組,等等。首先,我對(duì)樣式表做了一些較大的修改,如 清單 17 所示。清單 17. Object2.xsl.var = new Book(;( ;( ' ' ;( ' ' ;( ' ' ;( ' ' ;g_books.push( b ;.我定義了一個(gè)新的名為 createbook 的函數(shù),該函數(shù)構(gòu)建 book 對(duì)象,并由用于每本書(shū)的模板調(diào)用。createbook 函數(shù)還是調(diào)用 escape 函數(shù)來(lái)確保字符串被正確編碼??紤]到 HTML 方面,我必須向 Book 類(lèi)添加更多方法以便編碼后的 JavaScript 代碼能夠調(diào)用它們。這些新方法如 清單 18 所示。清單 18. Object2.html.原型

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論