【**,備忘】
flex的乙個特性是資料驅動。這麼說不太清楚,舉個例子吧,在網頁裡做乙個資料**,要先畫好**結構然後把資料填進去,而在flex 裡則是為datagrid指定乙個資料來源,資料來源的結構決定了datagrid的呈現樣式。很多時候資料來源是xml和xmllist充當的,所以了解xml和 xmllist還是有很有必要的。
一般情況下,由資料端語言生成xml或xmllist提供給flex,由flex直接使用或轉換成arraycollection展現資料。
那麼xml和xmllist有什麼區別呢,很簡單,看是否含有根節點。舉例來說:
學生一">
學生二">
老師一">
這就是乙個典型的xml,其中是根節點,是子節點。type,name是屬性名,等號右邊是屬性值。而
學生一" />
學生二" />
老師一" />
這一部分就是乙個xmllist。
好了,知道了什麼是xml和xmllist,下面看怎麼使用他們。
1、使用as建立xml
前面的**不羅嗦,直接看script裡的
private var mydata:xml;
]]>
注意一下,這是比較基礎的flex特性,全域性變數可以在函式體外定義,但例項話物件並賦值這個過程必須在函式體內進行,不然會報錯說變數未定義。用上面的**舉例:
private var mydata:xml = new xml();
mydata =
……
這樣寫**,ok,儲存的時候就會提示變數未定義。建立乙個function,在函式體內為mydata賦值才是正確的。
其實也可以在宣告變數的時候直接賦值,也不會報錯,如下:
private var mydata:xml =
……
在函式內呼叫mydata也不會任何問題。
另外,這種方式只能定義xml,既必須有根節點,不能定義xmllist。
除了直接給xml變數賦值外,還可以使用建構函式,如下:
private var mydata:xml;
]]>
這種形式要注意下xml中的引號要換成單引號。
2、用標籤建立xml/xmllist
廢話不說,直接看標籤**
注意啊, 在flex4裡,直接插入這個標籤是會報錯的,正確的做法應該是在外增加乙個父標籤。
同樣的定義xmllist,只是沒有標籤而已,不囉嗦。
3、輸出xml某一類節點
非常簡單,,可以直接使用點語法,看例子:
假設有這樣乙個xml,要取節點名為girl的子節點組成的xmllist,如下:
private var mydata:xml =
小剛"/>
小剛"/>
小花"/>
小蘭"/>
private var girls:xmllist ;
注意這個地方,如果名為girl的節點只有乙個,系統會報錯,後面會解釋。
1) 獲取全部節點mydata.elements("*")
2) 按節點名稱獲取節點mydata.elements("node")
3) 獲取節點下的所有所有節點mydata.node[0].elements() 第乙個node節點下的所有內容,比如說:
顯示的就是
4) 單條資料的情況,注意,下面一段呼應上面的紅色內容:
mydata2 =
資料2"/>
trace(mydata2.elements()) 怎麼顯示呢?嘿嘿,沒錯,就是啥都沒有,為啥?這裡說一下flex的乙個預設的情況,如果xml元素只有乙個節點,那麼flex預設輸出其節點內容而不是把節點整個顯示出來,而結點內容為空,自然就啥都顯示不出來了。下面的情況會有所不同:
mydata3 =
資料2">這個節點有內容了
trace(mydata3.elements()); 什麼情況呢?沒錯,就是會顯示「這個節點有內容了」這行字。
是不是單行節點無法顯示整個xmllist內容呢?當然不是,只要這樣就可以了:
trace(mydata2.elements().toxmlstring());
5)獲取下級節點的個數mydata.elements().length()
這裡這麼寫也沒什麼問題,不過事實上沒這麼簡單。舉個例子吧:
小剛"/>
小花"/>
老師"/>
小5班"/>
好,如果要檢視root下所有二級子節點的個數,mydata.elements().length()沒有問題,顯示的值為3;
如果要獲取root下所有後代的個數,就應該這樣寫mydata.descendants("*").length(),顯示值為5;
注意啊,這個descendants("*")返回的也是xmllist,不過返回的值很有意思,沒事兒可以測試下,這裡只說length相關,就不囉嗦了。
6) 獲取節點名字mydata.elements()[0].name() 不解釋
獲取節點內容mydata.elements()[0] 也可以用mydata.elements()[0].text();
7)獲取父節點節點名.parent() mydata.element[0].childe[0].parent().@name 其實就是element[0]的name屬性
8)取得屬性值和屬性名mydata.node[0].@name mydata第乙個節點的屬性name的值等價於mydata.node[0].attribute("name"),讀取全部的值mydata.node[0].atttibute("*")
9)對xml按條件過濾mydata.elements()[0].(@name=="tom"),注意如果mydata下的子孫節點有的沒有@name這個屬性,將取不到任何資訊。
10)新增節點組合生成xml
mydata.prependchild(),這是在最前面田間乙個節點
mydata.insertchildafter(mydata.node[0],),這是在第乙個節點後面新增
mydata.insertchildbefore(mydata.node[0],),這是在第乙個節點前面新增
mydata.newelement=
mydata.newelement=內容
mydata.node[1] = "aaa" 有這個節點就修改節點的內容,沒有的話就建立乙個節點
節點名字可以由變數組成var bl:int=2; mydata["node"+bl] = "name";
寫乙個用陣列構成xml的例子:
private function buildxml():void }}
11)新增、修改節點屬性
mydata.node[1].@name="aaa" 有name屬性則屬性值改為aaa,沒有就建立乙個name屬性
也可以動態新增屬性,比如說用迴圈
for(var i:int=0; i<3; i++)
12)刪除節點和屬性
刪除節點delete mydata.node[1]; 注意,這裡可以刪除多個節點
刪除屬性delete mydata.node[1].@name 注意,這裡同樣可以刪除多個
刪除所有屬性,需要使用迴圈
var attri:xmllist = mydata.node.@*;
4、讀取外部xml/xmllist
1)使用xml標籤
2)使用urlloader,在action中載入
import flash.net.urlloader;
import flash.net.urlrequest;
private function loadxml():void
private function completehander(e:event):void
如果在變異過程中出現錯誤提示「無法訪問本地資源....」,需要設定編譯引數:-use-netwrok = false
3)使用httpservice,看**:
import mx.rpc.events.resultevent;
private function resulthandler(e:resultevent):woid
Flex 讀取 Xml 資料總結 (E4X)
1 flex讀取的xml資料,要求存在乙個且只有乙個根結點。2 flex使用 操作符來讀取某個結點的屬性 bookxml.title.name 3 flex中使用e4x表示式可以對結點的值進行測試 bookxml.title.name flex 4 flex中還可以使用正規表示式對結點的值進行測試 ...
Flex中為控制項使用遠端XML資料
通過httpservice獲取xml資料 在瀏覽器中輸入 http www.flexgrocer.com units.xml,可以看到xml格式文件,將使用httpservice獲取該xml中的資料。開啟前面完成的dataentry.mxml檔案,如下 在中匯入兩個類,如下 在下面新增標籤,如下 當...
Flex中XML資料的處理
sy考勤 pk薪資 pz那麼瀏覽xml的方法如下 var headarr array new array headlink.dataprovider headarr headlink是乙個list型別的mxml標籤,如list,linkbar,box等.var nodes hxml.childnod...