Ajax學習(4)---在請求和響應中使用 XML(2)

----前言
在 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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章