----前言
在 Ajax 應用程式中,使用 XML 作為發送資料的格式的理由很少,但使伺服器向 客戶機回傳 XML 的理由很多。
理由:(1)客戶機以成對的名稱和數值發送請求(2)伺服器無法(以一種標準方式)發送成對的名稱和數值
在大多數情況下,客戶機不需要使用 XML,因為他們會使用成對的名稱和數值發送請求。因此,您可能會發送一個這樣的名稱:name=jennifer。只需簡單地在連續的成對的名稱和數值之間添加一個 “與” 符號(&),即可將其放在一起,就像這樣:name=jennifer&job=president。使用簡單的文本和這些名稱值對,客戶機即可輕鬆向伺服器請求多個值。很少需要用到 XML 提供的額外結構(及其帶來的額外開銷)。
實際上,需要向伺服器發送 XML 的所有理由都差不多可以歸入以下兩個基本的類別中:
伺服器僅 接受 XML 請求。在這類情況下,您別無選擇。上一期文章中介紹的基礎知識應已使您掌握了發送此類請求所必需的工具。
您正在調用一個僅接受 XML 或 SOAP 請求的遠程 API。這實際上就是上一種情況的特例,但值得單獨拿出來提一下。如果您希望在一個非同步請求中使用來自 Google 或 Amazon 的 API,就會有一些特殊的考慮事項。
如果伺服器使用字串 name=jennifer&job=president 應答一個應用程式,客戶機沒有任何標準化的簡便方法來將每個對拆分成名稱和值。您必須手動解析所返回的資料。如果伺服器返回一個由成對的名稱和數值構成的響應,這樣的響應的解釋難度與使用分號、豎線或其他任何非標準格式化字元相同。對於您來說,這就意味沒有任何簡單的方法在響應中使用純文字使客戶機以一種標準的方法擷取並解釋響應,至少在響應包含多個值時是如此。
----使用XML:
意識到沒有任何標準的方法可以使伺服器使用成對的名稱和數值響應客戶機之後,使用 XML 的原因也就顯而易見了。向客戶機發送資料時,成對的名稱和數值是非常好的選擇,因為伺服器和伺服器端語言可以輕鬆解釋成對的名稱和數值;向客戶機返回資料時使用 XML 也是如此。有幾種方法可從伺服器獲得 XML 響應,並使用較為標準的代碼提取資料,在客戶機中使用這些資料。
清單 1.伺服器響應(XML 格式)
<ratings>
<show>
<title>Alias</title>
<rating>6.5</rating>
</show>
<show>
<title>Lost</title>
<rating>14.2</rating>
</show>
<show>
<title>Six Degrees</title>
<rating>9.1</rating>
</show>
</ratings>
----將 XML 作為純文字處理
處理 XML 的最簡單的選擇(至少就學習新的編程技術而言),就是用與處理伺服器返回的其他文本片段相同的方法來處理它。換言之,基本上就是忽略資料格式,只關注伺服器的響應。
在這種情況下,您要使用請求對象的 responseText 屬性,就像在伺服器向您發送非 XML 響應時一樣。
清單 2. 將 XML 作為普通伺服器響應處理
function updatePage() {
if (request.readyState == 4) {
if (request.status == 200) {
var response = request.responseText;// response has the XML response from the server
alert(response);
}
}
}
在這個程式碼片段中,updatePage() 是回調方法,request 是 XMLHttpRequest 對象。最終,您將得到把所有一切串聯在一起的 XML 響應,位於 response 變數之中。
清單 3.response 變數的值:
<ratings><show><title>Alias</title><rating>6.5</rating>
</show><show><title>Lost</title><rating>14.2</rating></show><show>
<title>Six Degrees</title><rating>9.1</rating></show></ratings>
在這裡,您可以使用 JavaScript split 函數來拆分此資料,並通過基本的字串操作來獲得元素的名稱和值。毫無疑問,這是個令人頭疼的過程,它無視於您花費了大量時間來閱讀前幾期文章中 DOM(Document Object Model)相關內容這一事實。因此,我要強調,您應該牢記:利用 responseText,可以便於使用和輸出伺服器的 XML 響應,但我不會為您展示太多的代碼,在能夠使用 DOM 時,您不應選擇這種方法來獲得 XML 資料,下面您會看到這一點。
儘管可以 將伺服器的 XML 格式的響應視同為其他任何文本響應來處理,但這樣做沒有很好的理由。使用 DOM 這種對 JavaScript 友好的 API 來操縱 XML。還有更好的事情,JavaScript 和 XMLHttpRequest 對象提供了一個屬性,它能完美地擷取伺服器的 XML 響應,並且是以 DOM Document 對象的形式來擷取它。
清單 4 給出了一個執行個體。這段代碼與 清單 2 類似,但沒有使用 responseText 屬性,回呼函數使用的是 responseXML 屬性。該屬性在 XMLHttpRequest 上可用,它以 DOM 文檔的格式返回伺服器的響應。
清單 4. 將 XML 當作 XML
function updatePage() {
if (request.readyState == 4) {
if (request.status == 200) {
var xmlDoc = request.responseXML;// work with xmlDoc using the DOM
}
}
}
現在您有了一個 DOM Document,可以像處理其他任何 XML 一樣處理它。例如,隨後可能要擷取所有 show 元素,如 清單 5 所示。
清單 5. 擷取所有 show 元素
function updatePage() {
if (request.readyState == 4) {
if (request.status == 200) {
var xmlDoc = request.responseXML;
var showElements = xmlDoc.getElementsByTagName("show");
}
}
}
如果您熟悉 DOM,從這兒開始,看起來就應該有幾分熟悉了。您可以使用您所瞭解的全部 DOM 方法,輕鬆操縱從伺服器處接收到的 XML。
當然,您也可以混用普通的 JavaScript 代碼。例如,可以遍曆所有 show 元素,如 清單 6 所示。
清單 6. 遍曆所有 show 元素
function updatePage() {
if (request.readyState == 4) {
if (request.status == 200) {
var xmlDoc = request.responseXML;
var showElements = xmlDoc.getElementsByTagName("show");
for (var x=0; x<showElements.length; x++) {
// We know that the first child of show is title, and the second is rating
var title = showElements[x].childNodes[0].value;
var rating = showElements[x].childNodes[1].value;
// Now do whatever you want with the show title and ratings
}
}
}
}
通過這段非常簡單的代碼,您正是將 XML 響應作為 XML 而不是無格式的純文字進行了處理,還使用了一點 DOM 和簡單的 JavaScript 來處理伺服器響應。更重要的是,您使用了標準化的格式 —— XML,而不是以逗號分隔的值或以豎線分隔的成對的名稱和數值。換句話說,您將 XML 用在了最適合它的地方,避免了在不適合的地方使用它(比如說向伺服器發送請求時)。
----解釋 XML 的其他可選方法
除將 XML 作為無格式文本處理或使用 DOM 處理之外,還有一種非常流行的選擇很重要,值得一提。那就是 JSON(JavaScript Object Notation),這是一種綁定在 JavaScript 內的自由文字格式設定。大體上,可以用 JSON 做的事,用 DOM 都可以完成,反之亦然;選擇主要取決於偏好,當然也要為特定的應用程式選擇正確的方法。就現在而言,您應堅持使用 DOM,在接收伺服器響應的過程中熟悉 DOM。