<people>
<person gender="male">
<name>Ant</name>
<hair>Shaggy</hair>
<eyes>Blue</eyes>
<height measure="metric">176</height>
</person>
<person gender="male">
<name>Paul</name>
<hair>Spiky</hair>
<eyes>Grey</eyes>
<height measure="metric">178</height>
</person>
</people>
如果我們以字符串的形式得到了該 XML 文檔,那麼就可以通過以下簡單操作來“解析”該字符串:
var x = new XML(peopleXMLString);
另外,我們也可以簡單地將該 XML“嵌入”到代碼中:
var x =
<people>
<person gender="male">
<name>Ant</name>
<hair>Shaggy</hair>
<eyes>Blue</eyes>
<height measure="metric">176</height>
</person>
<person gender="male">
<name>Paul</name>
<hair>Spiky</hair>
<eyes>Grey</eyes>
<height measure="metric">178</height>
</person>
</people>;
是的——這是正確的——XML 變成了這種語言的一個直接部分。
通過 Rhino 使用 E4X
如果您同我們的操作完全一樣,那麼現在就可以嘗試該操作。Rhino 1.6R1 最新的版本以及來自 apache 的 XMLBeans 程序庫都支持 E4X。使用它們非常的簡單,只要獲取這些包,將它們解壓,然後將 JS.jar 和 xbean.jar 添加到您的類路徑中,就可以啟動 JavaScript 處理程序了。
Java -cp JS.jar;xbean.jar
org.mozilla.Javascript.tools.shell.Main
您現在可以嘗試以下實例。您可以將它們從該處剪切並復制,或者將它們包含在 examples1.JS 文件中,該文件位於 zip 文件(ws-AJax1code.zip)中,您可以通過點擊本文頂部或者底部的代碼圖標來下載該文件。
您僅僅需要使用 JavaScript 的屬性就可以查看 XML 的任何部分。例如:
print(x.person[0].name);
Ant
print(x.person[1].hair);
Spiky
您注意到了嗎,到目前為止,我們還沒有使用諸如 DOM 或者 SAX 之類的 XML API。XML 只是變成了一種 JavaScript 能夠理解的本地類型。
使用以下代碼來打印兩個人的高度:
for each (var h in x..height) { print(h) };
176
178
語法非常有用。它返回所有的,任何深度的能夠匹配後面緊跟的標記名稱的子元素。因此 x..height 返回 height 標記的數值。
以下是另一個有用的語法:
print(x.person.(name=="Ant").hair);
Shaggy
這將使得在 XML 樹中可以很容易地進行查看操作。
一個更復雜的樣本實例
假定您想要將高度值從米制度量單位更改為英美制度量單位(也就是英國人常說的英尺和英寸單位)。
下面首先是厘米到英寸的轉換...
function metricToImperial(cms) {
var totalinches = Math.round(cms/2.54);
var inch = totalinches%12;
var ft = (totalinches-inch)/12;
var response = <height/>;
response.feet = ft;
response.inches = inch + 2; // we sounded a bit short
response.@measure = "imperial";
return response;
}
首先值得注意的一行是:
var response = <height/>;
該行允許您將 XML “嵌入”到 JavaScript 中。采用這種語法有兩個好處:第一,它確實會使 XML 的使用變得很容易。第二,這些代碼的意義非常清晰。
現在您可以向該元素中添加更多的子元素:
response.feet = ft;
這樣創建了 <height> 子元素,其標記名稱被設置為“feet”,並且將數值設置為變量 ft 的值。
您也可以用這種方式操作其屬性:
response.@measure = "imperial";
現在我們使用該功能來更新 XML: