[ActionScript 3.0] as3處理xml的功能和遍歷節點

as3比as2處理xml的功能加強了N倍,獲取或遍歷節點很是之方便,相似於json對像的處理方式。json

XML 的一個強大功能是它可以經過文本字符的線性字符串提供複雜的嵌套數據。將數據加載到 XML 對象時,ActionScript 會分析數據並將其分層結構加載到內存(若是 XML 數據格式有誤,它會發送運行時錯誤)。code

利用 XML 和 XMLList 對象的運算符和方法能夠輕鬆遍歷 XML 數據的結構。xml

 

一、讀取外部 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);ip

function xmlLoaded(event:Event):void
{
myXML = XML(myLoader.data);
trace("Data loaded.");
}內存

 

二、使用點 (.) 運算符和後代存取器 (..) 運算符element

使用點 (.) 運算符和後代存取器 (..) 運算符能夠訪問 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 屬性)。

 


三、訪問父節點和子節點

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


四、訪問屬性

使用 @ 符號(屬性標識符運算符)能夠訪問 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 是首選方法。

 


五、按屬性或元素值過濾

可使用括號運算符 — ( 和 ) — 過濾具備特定元素名稱或屬性值的元素。請考慮下面的 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'));

六、使用 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;}

相關文章
相關標籤/搜索