2008年10月16日 11:57

【練習】在ActionScript 3中讀取XML

  在ActionScript 3.0中讀取XML是一件滿輕鬆的工作,使用者所要負責的只是指定來源,然後XML內容就會被處理成樹狀結構,XML類別繼承自Object,所以處理後的資料很容易使用,而讀取方式和前一篇載入影像所使用的Loader類別有所不同,這次使用的是URLLoader類別,二者的差異在於,前者用以載入影像和swf檔,後者則主要用以載入文件,二者都可以讀取遠端檔案,別被名稱裡的"URL"混淆了。 讀取XML的基本語法如下:
var myLoader:URLLoader = new URLLoader();
myLoader.load(new URLRequest("example.xml"));
// 載入後的讀取方式
var myXML:XML = new XML(myLoader.data);
接下來介紹實際範例與變化。

以下列的XML資料為例,檔案可點此下載
<?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
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
在此練習中是將XML用檔案儲存,置於網路空間中,但也可以直接給值,此時就不需要使用URLLoader類別,使用方式如下,注意第一行的XML標頭須去除。
var myXML:XML = 
	<CLASSROOM>
		<TEACHER>John</TEACHER>
		<STUDENT ID="X001">Afro</STUDENT>
		<STUDENT ID="X005">Bill</STUDENT>
		<STUDENT ID="X014">Candy</STUDENT>
	</CLASSROOM>
最後,附上Flash CS3 Help中的範例,羅列了各式用法。
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>
        }
    }
}

  • esabear 發表於樂多回應(4)引用(0)Flash筆記編輯本文
    樂多分類:網路/3C │昨日人次:4 │累計人次:9132 │標籤:練習,XML,URLLoader,flash
    Ads by Roodo! 

    引用URL

    http://cgi.blog.roodo.com/trackback/7388373

    回應文章

    不好意思,我想請問下,你的這段程式碼是直接放在flash裡面的動作裡實行嗎????
    不知道你明白我的意思嗎?
    ---------------------------------------------
    版主回覆:
    是阿 要放在flash的action裡 或者另外寫個as檔都可以
    | 檢舉 | Posted by bandyau at 2011年06月7日 13:07
    私密回應
    Posted at 2011年06月20日 19:42

    謝謝你的文章,非常實用與清楚!
    =)
    | 檢舉 | Posted by Rex at 2011年08月22日 10:47

    3Q~~~~~
    ---------------------------------------------
    版主回覆:
    :-)
    | 檢舉 | Posted by 路人甲 at 2012年01月6日 21:03