Flex動態讀取外部XML文件
在學習Flex的過程中,你可能會遇到Flex動態讀取外部xml文件問題,這里和大家分享一下,在Flex中xml文件是使用頻率非常高的,有的時候我們希望用xml作為配置文件來動態配置我們的系統。
Flex動態讀取外部xml文件
在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對象。
varurl:URLRequest=newURLRequest("TreeData.xml");
其中URLRequest的參數必須是一個有效的url,因為這個文件在和生成的swf在同一個目錄下,所以直接寫了文件名,TreeData.xml是外部xml文件的文件名。如果在其他目錄下文件名就必須帶路徑了。
二、讀取外部xml文件
1.創建URLLoader對象。
varloader:URLLoader=newURLLoader();
2.為新創建的對象注冊事件監聽,我們需要監聽的是Event.COMPLETE事件,這個事件代表讀取xml文件完成。
loader.addEventListener(Event.COMPLETE,onComplete);
onComplete是Event.COMPLETE事件的處理函數,當發生Event.COMPLETE事件的時候會調用這個函數。
3.調用load函數
loader.load(url);
參數url就是前面創建的URLRequest對象。
三、事件處理函數onComplete
函數的完整定義是這個樣子的:
privatefunctiononComplete(event:Event):void{}
前面已經把這個函數注冊給URLLoader對象的Event.COMPLETE事件了。當發生Event.COMPLETE事件時,這個函數就會被調用。接下來的問題就是怎么得到取到的xml數據了。
首先把onComplete函數的參數event的target屬性轉換成URLLoader對象
varresult:URLLoader=URLLoader(event.target);
然后再把這個對象的data屬性轉換成xml對象
datas=XML(result.data);
這樣就可以把TreeData.xml的內容讀取到了datas中了。
后記
使用這種方式可以動態的讀取xml文件。取到的內容可以動態配置程序,提供動態的數據源。至于具體怎樣應用就看自己的需求了。
完整的代碼:
- viewplaincopytoclipboardprint?
- <?xmlversionxmlversion="1.0"encoding="utf-8"?>
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute"creationComplete="init()">
- <mx:Script>
- <!--[CDATA[
- [Bindable]
- privatevardatas:XML=newXML();
- privatefunctioninit():void
- {
- varurl:URLRequest=newURLRequest("TreeData.xml");
- varloader:URLLoader=newURLLoader();
- loader.addEventListener(Event.COMPLETE,onComplete);
- loader.load(url);
- }
- privatefunctiononComplete(event:Event):void{
- varresult:URLLoader=URLLoader(event.target);
- datas=XML(result.data);
- }
- ]]-->
- </mx:Script>
- <mx:XMLidmx:XMLid="treeData"source="TreeData.xml"/>
- <mx:Treexmx:Treex="23.5"y="36"width="214"height="407"
- dataProvider="{datas.node}"labelField="@label"/>
- <mx:Treexmx:Treex="319.5"y="36"width="214"height="407"
- dataProvider="{treeData.node}"labelField="@label"/>
- </mx:Application>
- <?xmlversionxmlversion="1.0"encoding="utf-8"?>
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"
- layout="absolute"creationComplete="init()">
- <mx:Script>
- <!--[CDATA[
- [Bindable]
- privatevardatas:XML=newXML();
- privatefunctioninit():void
- {
- varurl:URLRequest=newURLRequest("TreeData.xml");
- varloader:URLLoader=newURLLoader();
- loader.addEventListener(Event.COMPLETE,onComplete);
- loader.load(url);
- }
- privatefunctiononComplete(event:Event):void{
- varresult:URLLoader=URLLoader(event.target);
- datas=XML(result.data);
- }
- ]]-->
- </mx:Script>
- <mx:XMLidmx:XMLid="treeData"source="TreeData.xml"/>
- <mx:Treexmx:Treex="23.5"y="36"width="214"height="407"
- dataProvider="{datas.node}"labelField="@label"/>
- <mx:Treexmx:Treex="319.5"y="36"width="214"height="407"
- dataProvider="{treeData.node}"labelField="@label"/>
- </mx:Application>
用到的TreeData.xml的內容:
- viewplaincopytoclipboardprint?
- <?xmlversionxmlversion="1.0"encoding="utf-8"?>
- <root>
- <nodelabelnodelabel="00 TOP"/>
- <nodelabelnodelabel="01 open">
- <nodelabelnodelabel="01backup"/>
- <nodelabelnodelabel="02edit"/>
- </node>
- <nodelabelnodelabel="execute"/>
- </root>
- <?xmlversionxmlversion="1.0"encoding="utf-8"?>
- <root>
- <nodelabelnodelabel="00 TOP"/>
- <nodelabelnodelabel="01 open">
- <nodelabelnodelabel="01backup"/>
- <nodelabelnodelabel="02edit"/>
- </node>
- <nodelabelnodelabel="execute"/>
- </root>
代碼補充說明:
代碼中用兩種方式讀取外部的xml文件為兩個Tree控件提供數據源,可以對比一下兩種方式的不同。
【編輯推薦】