一? 在介紹Flex中操作XML之前,首先簡單介紹下XML中的基本術語。????
元素:XML中擁有開始標簽和結束標簽的這一塊稱為“元素”????
節點:把XML元素與文本結合起來統稱為節點????
根節點:位于整個XML文當頂端的節點????
文本節點:包含文本的節點????
屬性:元素的組成部分,以鍵/值形式放在元素標簽內??
?
用一個例子來說明
view plain
<root_node>???????????<node?attribute="value">????????????text?node????????????</node>?????????????</root_node>???????????? XML簡單介紹完了;之后,將分別介紹XML對象的創建,XML對象的處理以及XML對象的運用。
?
二? Flex中創建XML對象
Flex中創建XML對象的方法有很多種,可以根據該XML對象的用途來決定使用哪種方法
1.創建一個XML對象,直接把XML文本賦給這個對象
view plain
var?textXmlObj:XML?=?<test><element>text</element></test>;?? 注意:這里等號右邊的表達式不用加上引號,因為AS認識它,知道它是一個XML,如果加上引號就成了String類型了,編譯也無法通過。
當然也可以動態的決定XML文本中的內容,用"{變量}"的方式插入到XML文本中。
view plain
var?text_node:String?=?"text";??var?textXmlObj:XML?=?<test><element>{text_node}</element></test>;?? ?
2.創建一個XML對象,并在構造方法中傳入字符串作為XML文本
我們平時在編程工作中,往往會以字符串的方式得到一個XML文本,這個時候就可以使用XML的構造方法來創建一個XML對象。
view plain
var?myText:String?=?"text";??var?str:String?=?"<test><element>"+?myText?+?"</element></test>";??var?textXmlObj:XML?=?new?XML(str);?? ?
3.從外部加載XML對象
對于比較大一點的XML文本來說,從外部加載無疑是最好的方式了,因為如果硬寫在程序中,就算是對XML對象進行最簡單的修改都是一個大災難。
外部加載這里介紹2種方式
1)如果你不是在Flex中開發而只是在比如Flash CS3中開發的話,可以使用下面的這種方法來加載外部XML
view plain
import?flash.events.Event;????????????import?flash.net.URLLoader;???????????import?flash.net.URLRequest;????????????????????????????var?externalXML:XML;??????????????var?loader:URLLoader?=?new?URLLoader();???????????var?request:URLRequest?=?new?URLRequest("xmlFile.xml");???????????loader.load(request);?????????????loader.addEventListener(Event.COMPLETE,?onComplete);????????????????????????????function?onComplete(event:Event):void?????????????{?????????????????var?loader:URLLoader?=?event.target?as?URLLoader;??????????????????if?(loader?!=?null)????????????????{??????????????????????externalXML?=?new?XML(loader.data);????????????????????trace(externalXML.toXMLString());??????????????????}??????????????????else???????????????{??????????????????????trace("loader?is?not?a?URLLoader!");???????????????}??????????????}????????????? ?
2) 如果是在Flex開發環境中就可以使用HttpService來加載外部的XML;如果這里看不懂代碼沒關系,后面將細致的介紹下面的這種處理方式
view plain
<?xml?version="1.0"?encoding="utf-8"?>??????????????????????????????????<mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml"?layout="absolute"????????????????????????????????????creationComplete="unitRPC.send()">???????????????????????????????????????????????????????????????????<mx:HTTPService?id="unitRPC"???????????????????????????????????????????url="xmlFile.xml"?????????????????????????????????????????result="unitRPCResult(event)"/>??????????????????????????????????????????????????????????????????????????<mx:Script>?????????????????????????????????????????<!--[CDATA[????????????????????????????????????????import?mx.rpc.events.ResultEvent;?????????????????????????????????????private?function?unitRPCResult(event:ResultEvent):void?{????????????????????????????????????????????????????????????????????????????}?????????????????????????????????]]-->??????????????????????????????????</mx:Script>????????????????????????????????</mx:Application>??????????????????????????????? ?
?
三 對XML對象進行處理
在介紹XML對象的處理之前,介紹一個擴展語言"E4X",E4X大大簡化了傳統對XML的操作方式(如DOM接口)。
你會發現在程序中E4X操作XML是如此的簡單,懶人們都樂壞了。
這里先給出一個XML對象,后面都將對這個對象進行操作
view plain
var?myXML:XML?=???????????<books>???????????????<book?name="flex?tutorial">??????????????????<price>30</price>??????????????????<author>adobe</author>???????????????</book>????????????????<book?name="sliverlight?tutorial">???????????????<price>40</price>??????????????????<author>microsoft</author>???????????????</book>????????????????<book?name="java?tutorial">??????????????????<price>50</price>??????????????????<author>sun</author>?????????????</book>????????????????<author>cyeric</author>???</books>???????????? ?
1)查詢???
使用"."操作符查詢節點,使用"[]"訪問指定索引的節點???
view plain
trace(myXML.book[0])?;????? 輸出???
<book name="flex tutorial">???
? <price>30</price>???
? <author>adobe</author>???
</book>???
輸出內容說明,得到了第一個子節點;另外,如果我們想查詢所有book節點的話只需要把[0]去掉就可以了。??
?
使用".."操作符訪問所有以該標簽命名的節點,而忽略節點的上下關系,注意最后那個節點
view plain
trace(myXML..author);?? 輸出
<author>adobe</author>
<author>microsoft</author>
<author>sun</author>
<author>cyeric</author>
可以看到,不管author位于哪個位置,都打印了出來
?
使用"@"操作符訪問節點屬性
view plain
trace(myXML.book[0].@name)?? 輸出
flex tutorial
第一個子節點的name屬性就被打印了出來
以上這4個操作符號".","[]","..","@" 即為最常用的4個E4X操作符,簡單吧,下面就循序漸進。
?
在查詢過程中可以使用E4X的過濾功能,假如我現在只想查詢價格在50塊以下的書,我們可以這樣
view plain
trace(myXML.book.(price<50));?? 輸出
<book name="flex tutorial">
? <price>30</price>
? <author>adobe</author>
</book>
<book name="sliverlight tutorial">
? <price>40</price>
? <author>microsoft</author>
</book>
價格為50元的那本書就沒有打印出來了。
屬性也可以過濾
view plain
trace(myXML.book.(@name=='flex?tutorial'));?? 輸出
<book name="flex tutorial">
? <price>30</price>
? <author>adobe</author>
</book>
?
我們還可以把查詢到的XML文本給改了,比如書店要把書都處理掉,然后叫賣:"5元5元一律5元"。
view plain
trace(myXML.book.(price=5));?? 輸出
<book name="flex tutorial">
? <price>5</price>
? <author>adobe</author>
</book>
<book name="sliverlight tutorial">
? <price>5</price>
? <author>microsoft</author>
</book>
<book name="java tutorial">
? <price>5</price>???
? <author>sun</author>???
</book>???
?
2) 修改,修改XML對象包括修改,添加和刪除操作???
雖然在介紹查詢的時候介紹過可以在查詢到XML文本的時候把它的內容給修改了。???
???
這里先給出一個XML對象,后面都將對這個對象進行操作???
view plain
var?myXML:XML?=?????<books>???????<book?name="flex?tutorial">?????????<price>30</price>?????????<author>adobe</author>???????</book>?????</books>????? ?
添加元素/節點,使用insertChildBefore和insertChildAfter方法在某一位置添加元素/節點,appendChild和prependChild方法在最前和最后添加元素/節點?
view plain
myXML.insertChildAfter(myXML.book[0],<newbook?name="After"/>);???myXML.insertChildBefore(myXML.book[0],<newbook?name="Before"/>);???myXML.appendChild(<newbook?name="Append"/>);???myXML.prependChild(<newbook?name="Prepend"/>);???trace(myXML);???
輸出?
<books>?
? <newbook name="Prepend"/>?
? <newbook name="Before"/>?
? <book name="flex tutorial">?
??? <price>30</price>?
??? <author>adobe</author>?
? </book>?
? <newbook name="After"/>?
? <newbook name="Append"/>?
</books>?
在第一個元素的前后各添加了一個元素?
?
添加屬性,直接使用E4X帶來的便利?
view plain
myXML.book[0].@date="2008";???trace(myXML);???
輸出?
<books>?
? <book name="flex tutorial" date="2008">?
??? <price>30</price>?
??? <author>adobe</author>?
? </book>?
</books>?
?
修改XML對象?
view plain
myXML.book[0].author="奧多比";???trace(myXML);????? <books>???
? <book name="flex tutorial">???
??? <price>30</price>???
??? <author>奧多比</author>???
? </book>???
</books>???
也很簡單,修改屬性的方法也是一樣???
?
刪除元素節點,屬性等,使用delete關鍵字???
view plain
delete?myXML.book[0].@name;?????delete?myXML.book[0].author;?????delete?myXML.book[0].price.text()[0];?????trace(myXML);????? 輸出???
<books>???
? <book>?????
??? <price/>?????
? </book>?????
</books>?????
?
?
四 在Flex中使用XML的例子
大的XML文檔用來顯示數據或者顯示列表的情況比較多,比如顯示數據時作為Datagrid的數據源,或者為List,Combobox,Tree等的顯示列表。
?
當我們使用List或者Combobox的時候,往往會把XML對象轉換為ArrayCollection對象,看下面的例子
外部Xml文件?
view plain
<books>?????????????????????????<book?name="flex?tutorial">?????????????????????????<price>30</price>?????????????????????<author>adobe</author>????????????????</book>?????????????????????<book?name="air?tutorial">??????????????????????????<price>40</price>?????????????????????<author>adobe</author>????????????????</book>?????????????????????<book?name="java?tutorial">?????????????????????????<price>50</price>?????????????????????<author>sun</author>??????????????????</book>?????????????????</books>???????????????????? Flex文件
view plain
<?xml?version="1.0"?encoding="utf-8"?>??????????????????<mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml"???????????????????layout="absolute"?????????????????creationComplete="init()">??????????????????<mx:Script>?????????????????<!--[CDATA[????????????????????????import?mx.collections.ArrayCollection;????????????????????????import?mx.rpc.events.ResultEvent;?????????????????????????????[Bindable]private?var?externalData:ArrayCollection?=?new?ArrayCollection();?????????????????????????????????????????????private?function?init():void?{????????????????????????????????????????myService.send();?????????????????????}???????????????????????????????????????????????private?function?resultHandler(event:ResultEvent):void?{??????????????????????????????????????externalData?=?event.result.books.book;???????????????????????}????]]-->??????????????????</mx:Script>????????????????????<!--創建Httpservice對象加載外部Xml-->???????????????????<mx:HTTPService?id="myService"?????????????????????url="xmlFile.xml"?????????????????????result="resultHandler(event)"/>????????????????????<!--用于顯示的list-->????????????????????<mx:List?id="datalist"?dataProvider="{externalData}"?labelField="name"/>??????????????????????????</mx:Application>??????????????? 將上面的代碼以debug模式執行,程序停在斷點處,在variables視圖中我們可以很清晰的看到程序HttpService對象在加載外部XML后已經把它轉換成了ArrayCollection對象,如下圖。這樣就可以很輕松的將數據源綁定到顯示列表對象List中。
?
?
另外一種情況,當我們使用Tree組件的時候,需要在HTTPService對象中加上resultFormat="e4x"以XML的格式讀取進來而不要轉換為ArrayCollection。
外部XML文件
view plain
<books>?????<category?name="RIA">???????<book?name="flex?tutorial"?price="30"?author="adobe">??????</book>?????????<book?name="air?tutorial"?price="40"?author="adobe">????????</book>?????</category>?????????<category?name="Java">??????????????<book?name="java?tutorial"?price="50"?author="sun">?????????</book>?????</category>?????????</books>???????? Flex文件
view plain
<?xml?version="1.0"?encoding="utf-8"?>??????????????<mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml"???????????????layout="absolute"?????????????creationComplete="myService.send()">????????????????<mx:HTTPService?id="myService"???????????????url="xmlFile.xml"?????????????resultFormat="e4x"/>?????????????????????<mx:XMLListCollection?id="booktreesrc"?????????????????source="{myService.lastResult.category}"/>???????????????????????<mx:Tree?id="bookTree"?????????????????height="100%"?????????????dataProvider="{booktreesrc}"??????????????labelField="@name"/>?????????????????????????????</mx:Application>??????????? 畫面顯示
轉載于:https://www.cnblogs.com/chengying/archive/2011/08/11/chengying.html
總結
以上是生活随笔為你收集整理的【转载】 详细介绍Flex中操作XML的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。