在Flex中xml檔案是使用頻率非常高的,因為在flex中xml檔案的操作非常簡單。有的時候我們希望用xml作為設定檔來動態配置我們的系統。雖然flexSDK提供了一個只能用在在mxml檔案中<xml/>標籤,這個標籤的source屬性可以讀取外部的xml檔案,但是這樣的方式會使xml檔案嵌入到產生的swf檔案中。這樣做的結果就是發布後即使修改了xml的內容對程式也麼有影響。這樣做沒有達到使用外部xml檔案的目的。要想實現動態讀取xml檔案需要使用到URLLoader這個類,這個類位於flash.net包中。
一、 建立URLRequest對象
要想使用URLLoader讀取外部的xml,必須調用URLLoader的load()函數。這個函數有一個參數就是URLRequest,所以必須先建立一個URLRequest對象。
var url:URLRequest = new URLRequest("TreeData.xml");
其中URLRequest 的參數必須是一個有效url,因為這個檔案在和產生的swf在同一個目錄下,所以直接寫了檔案名稱,TreeData.xml是外部xml檔案的檔案名稱。如果在其他目錄下檔案名稱就必須帶路徑了。
二、讀取外部xml
1.建立URLLoader對象。
var loader:URLLoader = new URLLoader();
2.為新建立的對象註冊事件監聽,我們需要監聽的是Event.COMPLETE事件,這個事件代表讀取xml檔案完成。
loader.addEventListener(Event.COMPLETE,onComplete);
onComplete是Event.COMPLETE事件的處理函數,當發生Event.COMPLETE事件的時候會調用這個函數。
3.調用load函數
loader.load(url);
參數url就是前面建立的URLRequest對象。
三、事件處理函數onComplete
函數的完整定義是這個樣子的:
private function onComplete(event:Event):void{}
前面已經把這個函數註冊給URLLoader對象的Event.COMPLETE事件了。當發生Event.COMPLETE事件時,這個函數就會被調用。接下來的問題就是怎麼得到取到的xml資料了。
首先把onComplete函數的參數event的target屬性轉換成URLLoader對象
var result:URLLoader = URLLoader(event.target);
然後再把這個對象的data屬性轉換成xml對象
datas = XML(result.data);
這樣就可以把TreeData.xml的內容讀取到了datas中了。
後記
使用這種方式可以動態讀取xml檔案。取到的內容可以動態配置程式,提供動態資料來源。至於具體怎樣應用就看自己的需求了。
完整的代碼:
<?xml version="1.0" encoding="utf-8"?><br /><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"><br /><mx:Script><br /><!--[CDATA[<br />[Bindable]<br />private var datas:XML = new XML();<br />private function init():void<br />{<br />var url:URLRequest = new URLRequest("TreeData.xml");<br />var loader:URLLoader = new URLLoader();<br />loader.addEventListener(Event.COMPLETE,onComplete);<br />loader.load(url);<br />}<br />private function onComplete(event:Event):void{<br />var result:URLLoader = URLLoader(event.target);<br />datas = XML(result.data);<br />}<br />]]--><br /></mx:Script><br /><mx:XML id="treeData" source="TreeData.xml"/><br /><mx:Tree x="23.5" y="36" width="214" height="407" dataProvider="{datas.node}" labelField="@label"/><br /><mx:Tree x="319.5" y="36" width="214" height="407" dataProvider="{treeData.node}" labelField="@label"/><br /></mx:Application>
用到的TreeData.xml的內容:
<?xml version="1.0" encoding="utf-8"?><br /><root><br /><node label="00 TOP"/><br /><node label="01 open"><br /><node label="01 backup" /><br /><node label="02 edit" /><br /></node><br /><node label="execute"/><br /></root>
代碼補充說明:
代碼中用兩種方式讀取外部的xml檔案為兩個Tree控制項提供資料來源,可以對比一下兩種方式的不同。