2008年10月16日
【練習】在ActionScript 3中讀取XML
在ActionScript 3.0中讀取XML是一件滿輕鬆的工作,使用者所要負責的只是指定來源,然後XML內容就會被處理成樹狀結構,XML類別繼承自Object,所以處理後的資料很容易使用,而讀取方式和前一篇載入影像所使用的Loader類別有所不同,這次使用的是URLLoader類別,二者的差異在於,前者用以載入影像和swf檔,後者則主要用以載入文件,二者都可以讀取遠端檔案,別被名稱裡的"URL"混淆了。
讀取XML的基本語法如下:
讀取XML的基本語法如下:
var myLoader:URLLoader = new URLLoader();接下來介紹實際範例與變化。
myLoader.load(new URLRequest("example.xml"));
// 載入後的讀取方式
var myXML:XML = new XML(myLoader.data);
以下列的XML資料為例,檔案可點此下載。
下列程式碼則用來處理XML檔案。[原始檔下載]
試著將trace()動作改成以下各行,由不同的輸出結果感受其用途:
<?xml version="1.0" encoding="utf-8"?>
<CLASSROOM>
<TEACHER>John</TEACHER>
<STUDENT ID="X001">Afro</STUDENT>
<STUDENT ID="X005">Bill</STUDENT>
<STUDENT ID="X014">Candy</STUDENT>
</CLASSROOM>
下列程式碼則用來處理XML檔案。[原始檔下載]
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
var myXML:XML;
var myLoader:URLLoader = new URLLoader();
myLoader.load(new URLRequest("xml_simple.xml"));
myLoader.addEventListener(Event.COMPLETE, XMLHandler);
function XMLHandler(e:Event):void {
myXML = new XML(e.target.data);
trace(myXML); // 結果顯示於Output欄,畫面不顯示
}
試著將trace()動作改成以下各行,由不同的輸出結果感受其用途:
trace(myXML.*); // 顯示所有, 包括STUDENT和TEACHER在此練習中是將XML用檔案儲存,置於網路空間中,但也可以直接給值,此時就不需要使用URLLoader類別,使用方式如下,注意第一行的XML標頭須去除。
trace(myXML.STUDENT); // 顯示所有STUDENT行
trace(myXML.STUDENT.*); // 顯示所有STUDENT裡的"值"
trace(myXML.STUDENT[1].*); // 顯示STUDENT裡的第2個值(第1個由[0]開始)
trace(myXML.STUDENT[2].@ID); // @可以取出屬性
trace(myXML.STUDENT.(@ID=="X001")); // @語法還可加上判斷式
trace(myXML.STUDENT.length()); // 總計STUDENT數量
trace(myXML.*.length()); // 用*表示模糊範圍, 包括STUDENT和TEACHER
var myXML:XML =最後,附上Flash CS3 Help中的範例,羅列了各式用法。
<CLASSROOM>
<TEACHER>John</TEACHER>
<STUDENT ID="X001">Afro</STUDENT>
<STUDENT ID="X005">Bill</STUDENT>
<STUDENT ID="X014">Candy</STUDENT>
</CLASSROOM>
package {
import flash.display.Sprite;
public class XmlExample extends Sprite {
public function XmlExample() {
var employees:XML =
<employees>
<employee ssn="123-123-1234">
<name first="John" last="Doe"/>
<address>
<street>11 Main St.</street>
<city>San Francisco</city>
<state>CA</state>
<zip>98765</zip>
</address>
</employee>
<employee ssn="789-789-7890">
<name first="Mary" last="Roe"/>
<address>
<street>99 Broad St.</street>
<city>Newton</city>
<state>MA</state>
<zip>01234</zip>
</address>
</employee>
</employees>;
trace(employees.employee[0].address.zip);
// 98765
trace(employees.employee[1].@ssn);
// 789-789-7890
trace(employees.employee.name);
// <name first="John" last="Doe"/>
// <name first="Mary" last="Roe"/>
trace(employees..zip[0]);
// 98765
trace(employees..@ssn[1]);
// 789-789-7890
trace(employees..name);
// <name first="John" last="Doe"/>
// <name first="Mary" last="Roe"/>
trace(employees.employee[0].address.*);
// <street>11 Main St.</street>
// <city>San Francisco</city>
// <state>CA</state>
// <zip>98765</zip>
var node:String = "zip";
trace(employees.employee[0].address[node]);
// 98765
var attribute:String = "ssn";
trace(employees.employee[1].@[attribute]);
// 789-789-7890
for each (var num:XML in employees..@ssn) {
trace(num); // 123-123-1234
} // 789-789-7890
var ssnToFind:String = "789-789-7890";
trace(employees.employee.(@ssn == ssnToFind).toXMLString());
// <employee ssn="789-789-7890">
// <name first="Mary" last="Roe"/>
// <address>
// <street>99 Broad St.</street>
// <city>Newton</city>
// <state>MA</state>
// <zip>01234</zip>
// </address>
// </employee>
}
}
}引用URL
http://cgi.blog.roodo.com/trackback/7388373