as3比as2處理xml的功能增強了N倍,獲取或遍歷節點非常之方便,類似於json對像的處理方式。
XML 的一個強大功能是它能夠通過文本字符的線性字符串提供復雜的嵌套數據。將數據加載到 XML 對象時,ActionScript 會分析數據並將其分層結構加載到內存(如果 XML 數據格式有誤,它會發送運行時錯誤)。
利用 XML 和 XMLList 對象的運算符和方法可以輕松遍歷 XML 數據的結構。
1、讀取外部 XML 文檔
可以使用 URLLoader 類從 URL 加載 XML 數據。若要在應用程序中使用以下代碼,請將示例中的 XML_URL 值替換為有效的 URL:
var myXML:XML = new XML();
var XML_URL:String = "http://www.87cool.com/sitemap.xml";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
myLoader.addEventListener("complete", xmlLoaded);
function xmlLoaded(event:Event):void
{
myXML = XML(myLoader.data);
trace("Data loaded.");
}
2、使用點 (.) 運算符和后代存取器 (..) 運算符
使用點 (.) 運算符和后代存取器 (..) 運算符可以訪問 XML 對象的子屬性。參考下面的 XML 對象:
var myXML:XML =
<order>
<book ISBN="0942407296">
<title>Baking Extravagant Pastries with Kumquats</title>
<author>
<lastName>Contino</lastName>
<firstName>Chuck</firstName>
</author>
<pageCount>238</pageCount>
</book>
<book ISBN="0865436401">
<title>Emu Care and Breeding</title>
<editor>
<lastName>Case</lastName>
<firstName>Justin</firstName>
</editor>
<pageCount>115</pageCount>
</book>
</order>對象 myXML.book 是一個 XMLList 對象,它包含名為 book 的 myXML 對象的子屬性。它們是兩個 XML 對象,與 myXML 對象的兩個 book 屬性匹配。
對象 myXML..lastName 是一個 XMLList 對象,該對象包含名為 lastName 的所有后代屬性。它們是兩個 XML 對象,與 myXML 對象的兩個 lastName 匹配。
myXML.book.editor.lastName 對象是一個 XMLList 對象,它包含 myXML 對象的名為 book 的子對象的名為 editor 的子對象的名為 lastName 的所有子對象:在本例中,XMLList 對象只包含一個 XML 對象(值為 "Case" 的 lastName 屬性)。
3、訪問父節點和子節點
parent() 方法返回 XML 對象的父項。
可以使用子級列表的序數索引值訪問特定的子對象。例如,假設 XML 對象 myXML 有兩個名為 book 的子屬性。每個名為 book 的子屬性都有一個與之關聯的索引編號:
myXML.book[0]
myXML.book[1]
要訪問特定的孫項,可為子項和孫項名稱同時指定索引編號:
myXML.book[0].title[0]
不過,如果 x.book[0] 只有一個子項名為 title ,則可以省略索引引用,如下所示:
myXML.book[0].title
同樣,如果對象 x 只有一個 book 子對象,並且如果該子對象只有一個 title 對象,則可以同時省略兩個索引引用,如下所示:
myXML.book.title
可以使用 child() 方法導航到名稱基於變量或表達式的子項,如下面的示例所示:
var myXML:XML =
<order>
<book>
<title>Dictionary</title>
</book>
</order>;
var childName:String = "book";
trace(myXML.child(childName).title) // output: Dictionary
4、訪問屬性
使用 @ 符號(屬性標識符運算符)可以訪問 XML 或 XMLList 對象的屬性,如下面的代碼所示:
var employee:XML =
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace(employee.@id); // 6401
可以一起使用 * 通配符和 @ 符號來訪問 XML 或 XMLList 對象的所有屬性,如下面的代碼所示:
var employee:XML =
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace(employee.@*.toXMLString());
// 6401
// 233
可以使用 attribute() 或 attributes() 方法訪問 XML 或 XMLList 對象的特定屬性或所有屬性,如下面的代碼所示:
var employee:XML =
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace(employee.attribute("id")); // 6401
trace(employee.attribute("*").toXMLString());
// 6401
// 233
trace(employee.attributes().toXMLString());
// 6401
// 233
請注意,還可以使用以下語法訪問屬性,如下面的示例所示:
employee.attribute("id")
employee["@id"]
employee.@["id"]其中每一個都等效於 employee.@id . 但是,語法 employee.@id 是首選方法。
5、按屬性或元素值過濾
可以使用括號運算符 — ( 和 ) — 過濾具有特定元素名稱或屬性值的元素。請考慮下面的 XML 對象:
var x:XML =
<employeeList>
<employee id="347">
<lastName>Zmed</lastName>
<firstName>Sue</firstName>
<position>Data analyst</position>
</employee>
<employee id="348">
<lastName>McGee</lastName>
<firstName>Chuck</firstName>
<position>Jr. data analyst</position>
</employee>
</employeeList>
以下表達式都是有效的:
x.employee.(lastName == "McGee") — 這是第二個 employee 節點。
x.employee.(lastName == "McGee").firstName — 這是第二個 employee 節點的 firstName 屬性。
x.employee.(lastName == "McGee").@id — 這是第二個 employee 節點的 id 屬性的值。
x.employee.(@id == 347) — 第一個 employee 節點。
x.employee.(@id == 347).lastName — 這是第一個 employee 節點的 lastName 屬性。
x.employee.(@id > 300) — 這是具有兩個 employee 屬性的 XMLList。
x.employee.(position.toString().search("analyst") > -1) — 這是具有兩個 position 屬性的 XMLList。
如果試圖按照可能不存在的屬性或元素過濾,則 Flash? Player 和 Adobe? AIR? 將引發異常。例如,以下代碼的最后一行產生一個錯誤,因為第二個 p 元素中沒有 id 屬性:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(@id == '123'));
同樣,以下代碼的最后一行也會產生一個錯誤,因為第二個 p 元素沒有 b 屬性:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(b == 'Bob'));
為了避免這些錯誤,可以使用 attribute() 和 elements() 方法來識別具有匹配屬性或元素的屬性,如下面的代碼所示:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(attribute('id') == '123'));
trace(doc.p.(elements('b') == 'Bob'));
還可以使用 hasOwnProperty() 方法,如下面的代碼所示:
var doc:XML =
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(hasOwnProperty('@id') && @id == '123'));
trace(doc.p.(hasOwnProperty('b') && b == 'Bob'));
6、使用 for..in 和 for each..in 語句
ActionScript 3.0 包含 for..in 語句和 for each..in 語句,用於遍歷 XMLList 對象。例如,我們來看 XML 對象 myXML 和 XMLList 對象 myXML.item 。XMLList 對象 myXML.item 由 XML 對象的兩個 item 節點組成。
var myXML:XML =
<order>
<item id='1' quantity='2'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2' quantity='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>;
for..in 語句用於遍歷 XMLList 中的一組屬性名稱:
var total:Number = 0;
for (var pname:String in myXML.item)
{
total += myXML.item.@quantity[pname] * myXML.item.price[pname];
}
for each..in 語句用於遍歷 XMLList 中的屬性:
var total2:Number = 0;
for each (var prop:XML in myXML.item)
{
total2 += prop.@quantity * prop.price;
}