flex 資料基礎 使用XML和XMLList

2021-08-31 21:52:26 字數 4719 閱讀 1155

【**,備忘】

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...