Flex中操作XML
发布时间:2020-12-15 04:58:21 所属栏目:百科 来源:网络整理
导读:XMLFlexAppleAdobeActionScript.flex 操作xml 实现增删改查2010-10-07 12:38转载自 zhao_gw最终编辑 zhao_gw详细介绍Flex中操作XML(上)2009年12月30日 星期三 12:05一 在介绍Flex中操作XML之前,首先简单介绍下XML中的基本术语。?? 元素:XML中拥有开始标签
XMLFlexAppleAdobeActionScript.flex 操作xml 实现增删改查2010-10-07 12:38转载自 zhao_gw最终编辑 zhao_gw详细介绍Flex中操作XML(上)2009年12月30日 星期三 12:05一 在介绍Flex中操作XML之前,首先简单介绍下XML中的基本术语。?? 元素:XML中拥有开始标签和结束标签的这一块称为“元素”??? 节点:把XML元素与文本结合起来统称为节点??? 根节点: 位于整个XML文当顶端的节点??? 文本节点:包含文本的节点??? 属性:元素的组成部分,以键/值形式放在元素标签内 用一个例子来说明 view plaincopy to clipboardprint? <root_node><!--这是一个根节点也 是一个元素-->??????????? <node attribute="value"><!--这是一个节点也是一个元素,其中包含有属性"attribute"--& gt;???????????? text node<!--这是一个文本节点-->???????????? </node>????????????? </root_node>??????????? <root_node><!--这是一个根节点也是 一个元素-->?? <node attribute="value"><!--这是一个节点也是一个元素,其中包含有属性"attribute"-->?? text node<!--这是一个文本节点-->?? </node>?? </root_node>?? XML简单介绍完了;之后,将分别介绍XML对象的创建,XML对象的处理以及XML对象的运用。 二 Flex中创建XML对象 Flex中创建XML对象的方法有很多种,可以根据该XML对象的用途来决定使用哪种方法 1.创建一个XML对象,直接把XML文本赋给这个对象 view plaincopy to clipboardprint? var textXmlObj:XML = <test><element>text</element></test>; var textXmlObj:XML = <test><element>text</element></test>; 注意:这里等号右边的表达式不用加上引号,因为AS认识它,知道它是一个XML,如果加上引号就成了String类型了,编译也无法通过。 当然也可以动态的决定XML文本中的内容,用"{变量}"的方式插入到XML文本中。 view plaincopy to clipboardprint? var text_node:String = "text";?? var textXmlObj:XML = <test><element>{text_node}</element></test>; var text_node:String = "text"; var textXmlObj:XML = <test><element>{text_node}</element></test>; 2.创建一个XML对象,并在构造方法中传入字符串作为XML文本 我们平时在编程工作中,往往会以字符串的方式得到一个XML文本,这个时候就可以使用XML的构造方法来创建一个XML对象。 view plaincopy to clipboardprint? var myText:String = "text";?? var str:String = "<test><element>"+ myText + "</element></test>";?? var textXmlObj:XML = new XML(str); 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 plaincopy to clipboardprint? 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!");??????????? }?????????????? }???????????? 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 plaincopy to clipboardprint? <?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 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 plaincopy to clipboardprint? 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>??????????? 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 plaincopy to clipboardprint? trace(myXML.book[0]) ;???? trace(myXML.book[0]) ;? 输出?? <book name="flex tutorial">?? <price>30</price>?? <author>adobe</author>?? </book>?? 输出内容说 明,得到了第一个子节点;另外,如果我们想查询所有book节点的话只需要把[0]去掉就可以了。 使用".."操作符访问所有以该标签命名的节点,而忽略节点的上下关系,注意最后那个节点 view plaincopy to clipboardprint? trace(myXML..author); trace(myXML..author); 输出 <author>adobe</author> <author>microsoft</author> <author>sun</author> <author>cyeric</author> 可以看到,不管author位于哪个位置,都打印了出来 使用"@"操作符访问节点属性 view plaincopy to clipboardprint? trace(myXML.book[0].@name) trace(myXML.book[0].@name) 输出 flex tutorial 第一个子节点的name属性就被打印了出来 以上这4个操作符号"."," []","..","@" 即为最常用的4个E4X操作符,简单吧,下面就循序渐进。 在查询过程中可以使用E4X的过滤功能,假如我现在只想查询价格在50块以下的书,我们可以这样 view plaincopy to clipboardprint? trace(myXML.book.(price<50)); 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 plaincopy to clipboardprint? trace(myXML.book.(@name=='flex tutorial')); trace(myXML.book.(@name=='flex tutorial')); 输出 <book name="flex tutorial"> <price>30</price> <author>adobe</author> </book> 我们还可以把查询到的XML文本给改了,比如书店要把书都处理掉,然后叫卖:"5元5元一律5元"。 view plaincopy to clipboardprint? trace(myXML.book.(price=5)); 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 plaincopy to clipboardprint? var myXML:XML =????? <books>????? <book name="flex tutorial">????? <price>30</price>????? <author>adobe</author>????? </book>????? </books>???? var myXML:XML =?? <books>?? <book name="flex tutorial">?? <price>30</price>?? <author>adobe</author>?? </book>?? </books>? 添加元素/节点,使用insertChildBefore和insertChildAfter方法在某一位置添加元素/节 点,appendChild和prependChild方法在最前和最后添加元素/节点 view plaincopy to clipboardprint? 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);?? 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 plaincopy to clipboardprint? myXML.book[0].@date="2008";??? trace(myXML);?? myXML.book[0].@date="2008"; trace(myXML); 输 出 <books> <book name="flex tutorial" date="2008"> <price>30</price> <author>adobe</author> </book> </books> 修改XML对象 view plaincopy to clipboardprint? myXML.book[0].author=" 奥多比";??? trace(myXML);???? myXML.book[0].author="奥多比"; trace(myXML);? <books>?? <book name="flex tutorial">?? <price>30</price>?? <author>奥多比</author>?? </book>?? </books>?? 也很简单,修改属性的方法也是一样? 删除元素节点,属性等,使用delete关键字?? view plaincopy to clipboardprint? delete myXML.book[0].@name;????? delete myXML.book[0].author;????? delete myXML.book[0].price.text()[0];????? trace(myXML);???? 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 : 利用HTTPService DataGrid从XML文件中加载数据 datagrid.mxml <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" ???? creationComplete="srv.send()"><!-- 发送HTTPService请求--> ??? ??? <mx:Script > ??????? <![CDATA[ ??????????? import mx.collections.XMLListCollection; ??????????? import mx.collections.ArrayCollection; ??????????? import mx.rpc.events.ResultEvent; ??????????? [Bindable] ??????????? private var users:XML; ????????? private? function resultUsers(event:ResultEvent):void{//处理结果 ????????? users = XML(event.result); ????????? datagrid.dataProvider=users.children();//XMLList ????????? ????????? } ??????? ]]> ??? </mx:Script> ??? ??? <mx:HTTPService url="XMLFile.xml" useProxy="false" id="srv" resultFormat="xml" result="resultUsers(event)"><!--处理结果函数--> ??????? ??? </mx:HTTPService> ??????? <mx:Panel x="416" y="75" width="458" height="269" layout="absolute" id="panel" title="用户信息" fontSize="14" fontWeight="bold" fontFamily="Verdana" color="#BB8BDD" borderStyle="solid" borderThickness="3" borderColor="#0E0505" cornerRadius="20" themeColor="#A3C2D8" alpha="0.85" backgroundColor="#FFFFFF" backgroundAlpha="0.84"> ??????????????? <mx:DataGrid x="32" y="10" width="374" height="193" id="datagrid" enabled="true" fontSize="13" fontWeight="bold" textAlign="center" color="#526BBE" borderColor="#C0C8CC" themeColor="#A9B1B3" alpha="0.86" alternatingItemColors="[#E9E9E9,#EFF8F9]" borderStyle="inset"> ??????????????????? <mx:columns> ??????????????????????? <mx:DataGridColumn headerText="ID" dataField="ID"/> ??????????????????????? <mx:DataGridColumn headerText="姓名" dataField="Name"/>?????????????????????? ??????????????????? </mx:columns> ??????????????? </mx:DataGrid>????????????? ??????? </mx:Panel> </mx:Application> XMLFile.xml ? <?xml version="1.0" encoding="utf-8" ?> ? <guestbook> ? <guest> ? <Name>25</Name> ? <ID>25</ID> ? </guest> ? <guest> ? <Name>24</Name> ? <ID>24</ID> ? </guest> ? <guest> ? <Name>23</Name> ? <ID>23</ID> ? </guest> ? <guest> ? <Name>22</Name> ? <ID>22</ID> ? </guest> ? <guest> ? <Name>21</Name> ? <ID>21</ID> ? </guest> ? <guest> ? <Name>20</Name> ? <ID>20</ID> ? </guest> ? <guest> ? <Name>19</Name> ? <ID>19</ID> ? </guest> ? <guest> ? <Name>18</Name> ? <ID>18</ID> ? </guest> ? <guest> ? <Name>17</Name> ? <ID>17</ID> ? </guest> ? <guest> ? <Name>16</Name> ? <ID>16</ID> ? </guest> ? <guest> ? <Name>15</Name> ? <ID>15</ID> ? </guest> ? <guest> ? <Name>14</Name> ? <ID>14</ID> ? </guest> ? <guest> ? <Name>10</Name> ? <ID>10</ID> ? </guest> ? <guest> ? <Name>9</Name> ? <ID>9</ID> ? </guest> ? <guest> ? <Name>8</Name> ? <ID>8</ID> ? </guest> ? <guest> ? <Name>7</Name> ? <ID>7</ID> ? </guest> ? <guest> ? <Name>4</Name> ? <ID>4</ID> ? </guest> ? <guest> ? <Name>3</Name> ? <ID>3</ID> ? </guest> ? <guest> ? <Name>1</Name> ? <ID>1</ID> ? </guest> ? </guestbook> 或者直接绑定: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="productsRequest.send()"> ??? <mx:HTTPService id="productsRequest" url="countXML.asp" /> ??? <mx:DataGrid x="20" y="80" id="productGrid" width="400" dataProvider="{productsRequest.lastResult.guestbook.guest}" > ??????? <mx:columns> ??????? <mx:DataGridColumn headerText="Name" dataField="Name" /> ??????? <mx:DataGridColumn headerText="ID" dataField="ID" /> ??????? </mx:columns> ??? </mx:DataGrid> </mx:Application> ============================ Flex之XML动态操作 XML 是一种结构化的描述数据形式,因其简单,灵活,尤其是在数据交换和可移植等优点现 已成为事实上的工业标准。 ActionScript 3.0 新增了新的操作XML的语法,即ECMAScript for XML,也叫E4X,提供一种比 Document Object Model (DOM)更简单更容易访问XML的新方式。使用E4X,你会发现操作XML 比以前更简单了 ActionScript 3.0 包含一些用于处理 XML 结构化信息的类。下面列出了两个主类: ■ XML:表示单个 XML 元素,它可以是包含多个子元素的 XML 文档,也可以是文档中 的单值元素。 ■ XMLList:表示一组 XML 元素。当具有多个“同级”(在 XML 文档分层结构中的相 同级别,并且包含在相同父级中)的 XML 元素时,将使用 XMLList 对象。例如, XMLList 实例是使用以下一组 XML 元素(可能包含在 XML 文档中)的最简便方法: <artist type="composer">Fred Wilson</artist> <artist type="conductor">James Schmidt</artist> <artist type="soloist">Susan Harriet Thurndon</artist> 技术名词: XML document : 包含XML的文件,也指读取和发送XML的数据,XML文档的概念不要和XMLDocument类搞混。 XML包 : 一个XML包指从整个XML文档中取出的片断 XML 节点e : XML最基本的块,节点可以是元素,文本节点,属性等等 XML 元素 : 这个术语和"Tag"意义类似,更确切地说,元素包含tags。元素必须有开始和结束标签 (<element></element>)或(<element />). Root 节点 : XML层级元素中最顶层的元素 Text 节点 : 包含文本的节点,一般都在元素里面 Attribute(属性): 元素的一部分,如<element name="value">,name="value"就是属性. XML 声明 : 典型的申明如<?xml version="1.0" ?>. XML 树 : XML 数据的节点层级构成XML 树 可以通过{}创建动态xml 添加XML元素: a:通过newElement属性来添加新的元素 Flex代码 var example:XML = <example />;?? example.newElement = <newElement />;?? /* 显 示:?? <example>?? <newElement/>?? </example>?? */?? var example:XML = <example />; example.newElement = <newElement />;? /* 显示: <example> <newElement/> </example> */ b:用(.)运算符 Flex代码 var example:XML = <example />;?? example.emptyElement = "";?? /* 显 示:?? <example>?? <emptyElement/>?? </example>?? */?? var example:XML = <example />; example.emptyElement = "";? /* 显示: <example> <emptyElement/> </example> */c:用([ 和]) Flex代码 var example:XML = <example />;?? var id:int = 10;?? example[ "user" + id ] = "";?? ?? /* 显 示:?? <example>?? <user10/>?? </example>?? */?? var example:XML = <example />; var id:int = 10; example[ "user" + id ] = "";? /* 显示: <example> <user10/> </example> */ 上述三种职能插入到尾部,可用insertChildBefore( )和insertChildAfter( ) 方法来控制插入的位置 Flex代码 var example:XML = <example/>;?? example.two = "";?? example = example.insertChildBefore( example.two,<one /> );?? example = example.insertChildAfter( example.two,<three /> );?? ?? /* 显 示:?? <example>?? <one/>?? <two/>?? <three/>?? </example>?? */?? var example:XML = <example/>; example.two = ""; example = example.insertChildBefore( example.two,<one /> ); example = example.insertChildAfter( example.two,<three /> );? /* 显示: <example> <one/> <two/> <three/> </example> */ 在XML元素中添加属性 : 使用E4X的@ 操作符 Flex代码 var example:XML = <example><someElement/></example>;?? example.someElement.@number = 12.1;?? example.someElement.@string = "example";?? example.someElement.@boolean = true;?? example.someElement.@array = ["a",null,7,undefined,"c"];?? ?? /* 显 示:?? <example>?? <someElement number="12.1" string="example" boolean="true"?? array="a,c"/>?? </example>?? */?? var example:XML = <example><someElement/></example>; example.someElement.@number = 12.1; example.someElement.@string = "example"; example.someElement.@boolean = true; example.someElement.@array = ["a","c"];? /* 显示: <example> <someElement number="12.1" string="example" boolean="true" array="a,c"/> </example> */ 但是有时如果属性名包含一些特殊符号,则不能用@操作符,必须加上[]操作符 example.someElement.@["bad-variable-name"] = "yes"; 在[]里还可用表达式产生动态属性名,这是种很实用的技巧: example.someElement.@["color" + num] = "red"; 读取XML树中的元素 : 使用elements( ) 方法返回XMLList 类型的所有元素,并用for each 循环遍历 Flex代码 var menu:XML = <menu>?? <menuitem label="File">?? <menuitem label="New"/>?? </menuitem>?? <menuitem label="Help">?? <menuitem label="About"/>?? </menuitem>?? This is a text node?? </menu>;?? ?? for each ( var element:XML in menu.elements( ) ) {?? /* 显 示:?? File?? Help?? */?? trace( element.@label );?? }?? var menu:XML = <menu> <menuitem label="File"> <menuitem label="New"/> </menuitem> <menuitem label="Help"> <menuitem label="About"/> </menuitem> This is a text node </menu>;? for each ( var element:XML in menu.elements( ) ) { /* 显示: File Help */ trace( element.@label ); } elements( ) 方法只返回下一级的子元素节点,这里面不包括文本节点和下一级节点.要向访问整个XML结构,还需进行递归循环处理 Flex代码 var menu:XML = <menu>?? <menuitem label="File">?? <menuitem label="New"/>?? </menuitem>?? <menuitem label="Help">?? <menuitem label="About"/>?? </menuitem>?? This is a text node?? </menu>;?? ?? /* 显 示:?? File?? New?? Help?? About?? */?? ?? walk( menu );?? ?? function walk( node:XML ):void {?? for each ( var element:XML in node.elements( ) ) {?? trace( element.@label );?? // Recursively walk the child element to reach its children?? walk( element );?? }?? }?? var menu:XML = <menu> <menuitem label="File"> <menuitem label="New"/> </menuitem> <menuitem label="Help"> <menuitem label="About"/> </menuitem> This is a text node </menu>;? /* 显示: File New Help About */? walk( menu );?? function walk( node:XML ):void { for each ( var element:XML in node.elements( ) ) { trace( element.@label ); // Recursively walk the child element to reach its children walk( element ); } } 通过节点名字来查找元素 : 直接使用E4X 的. 加上属性名语法来查找元素 var fruit:XML = <fruit><name>Apple</name></fruit>; trace( fruit.name );// 显示: Apple var author:XML = <author><name><firstName>Darron</firstName></name></author>; trace( author.name.firstName );// 显示: Darron 还有种简便的方法,即使用双点操作符(..)来跳过一级访问,如: var author:XML = <author><name><firstName>Darron</firstName></name></author>; trace( author..firstName );// 显示: Darron 当有多个元素节点具有相同名称时,可通过索引值访问,这有点像数组,使用中括号 Flex代码 var items:XML = <items>?? <item>?? <name>Apple</name>?? <color>red</color>?? </item>?? <item>?? <name>Orange</name>?? <color>orange</color>?? </item>?? </items>;?? ?? trace( items.item[0].name );// 显示: Apple?? trace( items.item[1].name );// 显示: Orange?? var items:XML = <items> <item> <name>Apple</name> <color>red</color> </item> <item> <name>Orange</name> <color>orange</color> </item> </items>;? trace( items.item[0].name );// 显示: Apple trace( items.item[1].name );// 显示: Orange 元素节点,但又不知道有多少个,可用for each 循环遍历 Flex代码 var items:XML = <items>?? <item>?? <name>Apple</name>?? <color>red</color>?? </item>?? <item>?? <name>Orange</name>?? <color>orange</color>?? </item>?? </items>;?? ?? // 使 用双点操作符?? for each ( var name:XML in items..name ) {?? /* 显 示:?? Apple?? Orange?? */?? trace( name );?? }?? var items:XML = <items> <item> <name>Apple</name> <color>red</color> </item> <item> <name>Orange</name> <color>orange</color> </item> </items>;? // 使用双点操作符 for each ( var name:XML in items..name ) { /* 显示: Apple Orange */ trace( name ); } 也可用[]操作符来访问: var nodeName:String = "color"; var fruit:XML = <fruit><color>red</color></fruit>; trace( fruit[nodeName] );// Displays: red 需要注意的是[]操作符不能和双点操作符一起用 trace( fruit..[nodeName] ); // 导致编译错误 text( ) 方法可正确返回文本节点内容: Flex代码 var fruit:XML = <fruit>?? <name>Apple</name>?? An apple a day...?? </fruit>;?? ?? for each ( var textNode:XML in fruit.text( ) ) {?? trace( textNode );// 显 示: An apple a day...?? }?? var fruit:XML = <fruit> <name>Apple</name> An apple a day... </fruit>;? for each ( var textNode:XML in fruit.text( ) ) { trace( textNode );// 显示: An apple a day... } 读取元素的属性 : 使用attributes( ) 方法返回指定元素的属性列表,或者通过名称用E4X的@操作符或attribute( ) Flex代码 var fruit:XML = <fruit name="Apple" color="red" />;?? var attributes:XMLList = fruit.attributes( );?? ?? trace( attributes[0] );// 显示: Apple?? trace( attributes[1] );// 显示: red?? var fruit:XML = <fruit name="Apple" color="red" />; var attributes:XMLList = fruit.attributes( );? trace( attributes[0] );// 显示: Apple trace( attributes[1] );// 显示: red name( ) 方法可显示出属性名 Flex代码 var fruit:XML = <fruit name="Apple" color="red" />;?? for each ( var attribute:XML in fruit.attributes( ) ) {?? trace( attribute.name( ) + " = " + attribute.toString( ) );?? ?? /* 显 示:?? name = Apple?? color = red?? */?? }?? var fruit:XML = <fruit name="Apple" color="red" />; for each ( var attribute:XML in fruit.attributes( ) ) { trace( attribute.name( ) + " = " + attribute.toString( ) );? /* 显示: name = Apple color = red */ } 如果属性名含有特殊字符,可用[]进行访问 使用delete 关键字删除元素,文本节点和属性 ;delete只能一次删除一个节点,如果要删除多个节点,可通过for循环进行删除 ===================== Flex 读XML动态增加按钮,显示Flash 首先准备一个XML文件和一个等下用来显示的TEST1.SWF,Test2.swf(当然我这里没有放Test2.swf) XML中写上 <files> <file> <name>test1.swf</name> <url>test1.swf</url> </file> <file> <name>test2.swf</name> <url>test2.swf</url> </file> </files> url 是文件的路径 接下来在test.mxml中写上以下代码 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" ??? backgroundGradientColors="[0x000000,0x888888]" ??? horizontalAlign="left" ??? paddingBottom="2" ??? paddingTop="2" ??? paddingLeft="2" ??? paddingRight="2" ??? > ??? <mx:Script> ??????? <![CDATA[ ???????? import flash.events.*; ????????? import mx.controls.Alert; ????????? import mx.events.ItemClickEvent; ??????? import mx.events.ListEvent; ????????? private var alert:Alert; ????????? private var mc:MovieClip; ????????? public var selectedNode:XML; ?? private function changeSettingXml():void { ???? filelinkService.url = xmlsrc.text; ???? filelinkService.send(); ?? } ?? private function itemClickEvent(event:ListEvent):void { ?????????????? ???? selectedNode=dg.selectedItem as XML; ???? //alert = Alert.show(selectedNode.url,"URL"); ???? swfload.load(selectedNode.url); ?? } ]]> ??? </mx:Script> ??? <mx:HTTPService id="filelinkService" url="" resultFormat="e4x"/> ??? <mx:XMLListCollection id="myXC" source="{filelinkService.lastResult.file}"/>? ??? <mx:TextInput id="xmlsrc" text="1.xml" color="0x323232"/> ??? <mx:Button label="fake login" click="changeSettingXml()" color="0x323232"/> ??? <mx:DataGrid id="dg" color="0x323232" width="100%" height="100%" dataProvider="{myXC}" itemClick="itemClickEvent(event);" > ?? <mx:columns> ????? <mx:DataGridColumn dataField="name" headerText="Name"/> ?? </mx:columns> </mx:DataGrid> <mx:SWFLoader id="swfload" source="" showBusyCursor="true" scaleContent="false" autoLoad="false"/> </mx:Application> ======================== flex mx:model加载外部xml文件 使用<mx:Model id="example"/> 可在Model里放置数据的结构: <mx:Model id="userData"> ???????? <user> ???????????? <email></email> ???????????? <phone></phone> ???????????? <address> ???????????????? <city></city> ???????????????? <state></state> ???????????? </address> ???????? </user> ???? </mx:Model> 或者直接放置数据: <mx:Model id="userData"> ???????? <user> ???????????? <email>example@example.com</email> ???????????? <phone>123 555-1212</phone> ???????????? <address> ???????????????? <city>Exampleville</city> ???????????????? <state>CA</state> ???????????? </address> ???????? </user> ???? </mx:Model> 但一般把较多的数据这在一个文件中: <mx:Model id="statesModel" source="states.xml" /> 这个文件的数据是在编译时被载入,而不是运行时。它与在<Model>标签里直接嵌入数据是一样的,只不过这样更简洁。一旦编译成.swf文件之后,你就不用带上这个文件,因为数据已被编译进.swf文件。<mx:Model>并不是有名叫Model一个ActionScript类与它对应,实际上它是创建了一个ObjectProxy类的实例,ObjectProxy对象是一个Object实例的封装,完全可以象Object实例一样去对待它,使用ObjectProxy主要的目的是可以数据绑定。 因为相当于在ActionScript中创建了一个对象,当然可以使用点语法来直接访问它的子节点对象。对象本身的ID与它的根节点是同义的。即访问其子节点对象时不用再加根对象的名字了。 当一个data model结构是由两个或更多的同名兄弟节点组成是,它们将被转换成一个数组。如statesModel.state将是一个数组,存储了statesModel对象的所有名为state的子对象。一般<mx:Model>用于传统数据,如对象,字符串和数组。而想用XML格式数据时,使用<mx:XML>标签。 <mx:XML>有一个xmlns属性来指定这个XML的命名空间。 一个<mx:XML>标签,在ActionScript中默认是创建一个XML对象,此时它的format属性为缺省的e4x,如果设置为xml,将会创建一个flash.xml.XMLNode对象。 使用ActionScript类 虽然使用<mx:Model><mx:XML>简单省力,但在很多情况下并不是理想的方案。它们适用于简单,静态的数据。但对于复杂的,动态的,或者带有规则的数据,使用定制的ActionScript类是更好的方法。因为: 1)使用<mx:Model>和<mx:XML>你不能强制数据的类型,但AS能。 2)不能进行数据的测试/一致性检查等,但AS类的setter方法可以测试有效的值,对无效的值可以忽略,转换或是出错。 3)不能带上商务逻辑 4)不能使用优雅的设计模式。AS类可让整个应用都可存取的实例???写一个AS类作数据模型是简单的,只需定义一个类,为所有的属性定义公共的存取方法。所有setter和getter方法都是强类型的,有些Setter方法进行数据测试检查。 在包中定义类之后: package com.oreilly.programmingflex.data { public class User{ } } 就可以在MXML中创建它的实例了,但得首先将包声明为命名空间:???? <?xml version="1.0" encoding="utf-8"?> ???? <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml " xmlns:data="com.oreilly.programmingflex.data.*" layout="absolute">???????? <data:User id="user" email="example@example.com " lastLogin="{new Date()}" ??????????????????? nameFirst="Abigail" nameLast="Smith" userType="1" />???? </mx:Application> 若在AS中使用,你需要导入这个类,然后使用它: ???? import com.oreilly.programmingflex.data.User; ???? private var user:User;???? private function initializeHandler(event:Event):void { ???????? user = new User(); ???????? user.email = "example@example.com "; ???????? // etc. ????? } ====================================== flex读取外部XML文件方式: 在Flex中我们经常使用xml文件,因为Flex支持强大的E4X功能,读取xml相当简洁。 ?????? 总结一下常用的读取XML配置文件的方法: ????? 1. 使用Model标签形式 ?????? 首先声明Model标签, ?????? <mx:Model id="model" source="conf/configuration.xml"/> ?????? xml形如: ?????? <config> ??????????????? <username>hd</username> ?????????????? <psw>123456<psw> ?????? </config> ?????? 那么,只需要在初始化事件中直接调用即可,例如:model.username,model.psw即可取到想要的值。 ????? 2. 使用URLLoader ???? var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE,handleURLLoaderCompleted); urlLoader.load(new URLRequest("conf/configuration.xml")); ??? private function handleURLLoaderCompleted(event:Event):void { var loader:URLLoader = event.target as URLLoader; xml = XML(loader.data); // dispatch Event here } ??? 3. 使用HttpService ??? <mx:HTTPService id="xmlReader" url="conf/configuration.xml" ????????????????????????????????????????????????????????????????? result="resultHandler(event)"/>????? ?? private function resultHandler(event:ResultEvent):void { var dp:ArrayCollection = event.result as ArrayCollection; ?????? ...... }??? ??? 在组件的createComplete事件中添加 xmlReader.send();语句调用Http请求。这种方法读取的XML文件格式是数组的形式,所以用ArrayCollection接收。如果想使用强大的E4X功能,需要在HTTPService对象中加上resultFormat="e4x"以XML的格式读取进来而不要转换为ArrayCollection。 注意:通过第一种方法加载进来的XML是在编译时编译到程序里面的,编译后再修改XML对程序无任何影响。所以还是用第二和第三种方法来加载外部XML文件。 flex操作XML类型变量 在介绍XML对象的处理之前,介绍一个扩展语言"E4X",E4X大大简化了传统对XML的操作方式(如DOM接口)。 你会发现在程序中E4X操作XML是如此的简单,懒人们都乐坏了。 这里先给出一个XML对象,后面都将对这个对象进行操作 view plaincopy to clipboardprint? 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>??????????? 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)查询?? 使用"."操作符查询节点,使用"[]"访问指定索引的节点?? trace(myXML.book[0]) ;?????? 输出?? <book name="flex tutorial">?? <price>30</price>?? <author>adobe</author>?? </book>?? 输出内容说明,得到了第一个子节点;另外,如果我们想查询所有book节点的话只需要把[0]去掉就可以了。 使用".."操作符访问所有以该标签命名的节点,而忽略节点的上下关系,注意最后那个节点 trace(myXML..author); 输出 <author>adobe</author> <author>microsoft</author> <author>sun</author> <author>cyeric</author> 可以看到,不管author位于哪个位置,都打印了出来 使用"@"操作符访问节点属性 trace(myXML.book[0].@name) 输出 flex tutorial 第一个子节点的name属性就被打印了出来 以上这4个操作符号".","[]","..","@" 即为最常用的4个E4X操作符,简单吧,下面就循序渐进。 在查询过程中可以使用E4X的过滤功能,假如我现在只想查询价格在50块以下的书,我们可以这样 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元的那本书就没有打印出来了。 属性也可以过滤 trace(myXML.book.(@name=='flex tutorial')); 输出 <book name="flex tutorial"> <price>30</price> <author>adobe</author> </book> 我们还可以把查询到的XML文本给改了,比如书店要把书都处理掉,然后叫卖:"5元5元一律5元"。 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对象,后面都将对这个对象进行操作??????? var myXML:XML =?? <books>?? <book name="flex tutorial">?? <price>30</price>?? <author>adobe</author>?? </book>?? </books>?? 添加元素/节点,使用insertChildBefore和insertChildAfter方法在某一位置添加元素/节点,appendChild和prependChild方法在最前和最后添加元素/节点 myXML.insertChildAfter(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带来的便利 myXML.book[0].@date="2008";??? trace(myXML);?? 输出 <books> <book name="flex tutorial" date="2008"> <price>30</price> <author>adobe</author> </book> </books> 修改XML对象 myXML.book[0].author="奥多比";??? trace(myXML);???? <books>?? <book name="flex tutorial">?? <price>30</price>?? <author>奥多比</author>?? </book>?? </books>?? 也很简单,修改属性的方法也是一样? 删除元素节点,属性等,使用delete关键字?? 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是本地数据类型,就像Number或Boolean一样。 ===================================== Flex基础_读取xml2010-08-26 06:43 BlogReader2.mxml <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="feedRequest.send()"> <mx:Script> <![CDATA[ import flash.net.navigateToURL; ]]> </mx:Script> <!-- 利用flex获取并显示数据2 --> <mx:HTTPService id="feedRequest" url="http://localhost:8080/flexTest.xml" useProxy="false"/> <mx:Panel x="10" y="10" width="475" height="400" layout="absolute" title="{feedRequest.lastResult.rss.channel.title}" > <mx:DataGrid x="10" y="10" id="dgPosts" width="400" dataProvider="{feedRequest.lastResult.rss.channel.item}"> <mx:columns> <mx:DataGridColumn headerText="Posts" dataField="title"/> <mx:DataGridColumn headerText="Date" dataField="pubDate" width="150"/> </mx:columns> </mx:DataGrid> <mx:LinkButton x="10" y="225" label="Read full part" click="navigateToURL(new URLRequest(dgPosts.selectedItem.link));"/> <mx:TextArea x="10" y="175" width="400" htmlText="{dgPosts.selectedItem.description}"/> </mx:Panel> </mx:Application> flexTest.xml <?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <!-- 该文件放到tomcat的root目录 --> <channel> <title>你好,flex获取并显示数据</title> <item> <title>hello world</title> <description> this is a best exanple in flex,you can do it with me,and may you hava a wanderful future </description> <link>http://hi.baidu.com/shiryu963</link> <guid>http://hi.baidu.com/shiryu963</guid> <category>general</category> <pubDate>2009.6.8 12:17:11</pubDate> </item> <item> <title>hello kava</title> <description> best wishs to me,this is a best exanple in flex,and may you hava a wanderful future </description> <link>http://hi.baidu.com/shiryu963</link> <guid>gech.com</guid> <category>general</category> <pubDate>2009.8.8 6:20:11</pubDate> </item> <item> <title>hello shiryu</title> <description> i hava a best wish to you,and may you hava a wanderful future </description> <link>http://hi.baidu.com/shiryu963</link> <guid>hahahhahhahahah</guid> <category>improtant</category> <pubDate>2009.4.22 6:20:11</pubDate> </item> </channel> </rss> ======================================= Flex DataGrid通过HttpService从外部xml文件中读取数据,代码如下: <?xml version="1.0" encoding="utf-8"?> <!-- creationComplete="srv.send()" 是调用HTTPService的 --> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="srv.send()" layout="vertical" verticalAlign="top" ??? horizontalAlign="center" backgroundGradientColors="[#4DB2FF,#6CB1FF]" paddingTop="0" backgroundGradientAlphas="[1.0,1.0]"> <mx:Script> <![CDATA[ ?? import mx.rpc.events.ResultEvent; ?? //定义一个XML格式的变量,一定要使用[Bindable]绑定 ?? [Bindable] ??????? private var contents:XML; ?? private function result(event:ResultEvent):void{//处理结果 ??? //将返回的结果赋给contents,需要强制转换 ??? contents = XML(event.result.toString()); ??? //给DataGrid赋值 ??? dg.dataProvider=contents.children();//XMLList ??????? } ]]> </mx:Script> <!-- resultFormat="e4x"表示返回的值为XML并且作为ActionScript XML对象中的文本XML返回,可以使用ECMAScript for XML(E4X)表达式进行访问 resultFormat="xml"表示返回的值为XML并且作为ActionScript XLnode对象中的文本XML返回。 url="content.xml",也可以写为url="F:FlexDemobin-debugcontent.xml" 注:这里的url只是在单纯的Flex工程中使用的方法, 如果使用tomcat的话,就只能写成url="content.xml"和url="http://localhost:8080:FlexDemobin-debugcontent.xml" 如果写成url="http://IP或是外网:8080:FlexDemobin-debugcontent.xml"用现在的方式都是取不到数据的 --> <mx:HTTPService url="content.xml" id="srv" resultFormat="e4x" result="result(event);"> </mx:HTTPService> ??? <mx:Panel title="DataGrid从外部xml中获取数据" layout="vertical" color="0xffffff" borderAlpha="0.15" width="496" ???????? paddingTop="5" paddingRight="10" paddingBottom="10" paddingLeft="10" horizontalAlign="center" fontSize="14" height="294"> ??????? <mx:DataGrid id="dg" color="0x323232" width="100%" rowCount="3" height="117"> ??????????? <mx:columns> ??????????????? <mx:DataGridColumn dataField="name" headerText="姓名"/> ??????????????? <mx:DataGridColumn dataField="phone" headerText="电话"/> ??????????????? <mx:DataGridColumn dataField="dept" headerText="部门"/> ??????????? </mx:columns> ??????? </mx:DataGrid> ??????? <mx:Form color="0x323232" width="100%" height="100" paddingTop="0" paddingBottom="0" > ??? <mx:FormItem label="姓名:" paddingTop="0" paddingBottom="0"> ???? <mx:Label text="{dg.selectedItem.name}"/> ??????????? </mx:FormItem> ??????????? <mx:FormItem label="部门:" paddingTop="0" paddingBottom="0"> ???????????? <mx:Label text="{dg.selectedItem.dept}"/> ??????????? </mx:FormItem> ??????????? <mx:FormItem label="电话:" paddingTop="0" paddingBottom="0"> ??????????? <mx:Label text="{dg.selectedItem.phone}"/> ??????????? </mx:FormItem> ??????? </mx:Form> ??? </mx:Panel> </mx:Application> 运行如图,01.jgp 02.jpg ======================================= [Flex] Flex读取xml文件 几种方法2010-02-08 17:02主要有两个方法: (1)通过HTTPService (2)通过URLLoader 代码如下: mxml代码 <?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; ??? import mx.rpc.http.HTTPService; ?? ??? public const xmlUrl:String = "config.xml"; ??? [Bindable] private var colors1:ArrayCollection; ??? [Bindable] private var colors2:XML; ?? ??? private function init():void{ ???? //方法一:通过HTTPService ???? var service:HTTPService = new HTTPService(); ???? service.url = xmlUrl; ???? service.addEventListener(ResultEvent.RESULT,resultHandler); ???? service.send(); ??? ???? //方法二:通过URLLoader ???? var request:URLRequest = new URLRequest(xmlUrl); ???? var loader:URLLoader = new URLLoader(request); ???? loader.addEventListener(Event.COMPLETE,loaderCompleteHandler); ??? } ?? ??? private function resultHandler(event:ResultEvent):void{ ???? colors1 = event.result.colors.color; ??? } ?? ??? private function loaderCompleteHandler(event:Event):void{ ???? colors2 = new XML(event.target.data); ??? } ?? ]]> </mx:Script> <mx:List x="100" y="150" dataProvider="{colors1}" labelField="name"> </mx:List> <mx:List x="300" y="150" dataProvider="{colors2.color}" labelField="@name"> </mx:List> </mx:Application> config.xml文件 <colors> <color name="LightGrey" value="#D3D3D3"/> <color name="Silver" value="#C0C0C0"/> <color name="DarkGray" value="#A9A9A9"/> <color name="Gray" value="#808080"/> <color name="DimGray" value="#696969"/> <color name="Black" value="#000000"/> </colors> 注:注意两种方式返回结果的差异 =========================== flex中读取xml数据2010-03-18 15:36xml文件源码: <?xml version="1.0" encoding="UTF-8"?> <citys> <city name="呼和浩特" lon="111.65" lat="40.8166666666667" /> <city name="广州" lon="113.233333333333" lat="23.1666666666667" /> <city name="深圳" lon="114.066666666667" lat="22.6166666666667" /> </citys> flex源码: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" creationComplete="init()"> <mx:HTTPService id?????????? = "indexMenu" showBusyCursor = "true" ??????????????????? method?????? = "POST"????? url??????????? = "mapWeather.xml" ??????????????????? useProxy???? = "false"???? result???????? = "httpIndexMenuResult(event)" ??????????????????? resultFormat = "e4x" />?????? <mx:Script> ??????? <![CDATA[?? ??? import mx.rpc.events.ResultEvent; ??? import mx.collections.ArrayCollection; ??? import mx.controls.Button; ??? [Bindable]private var menuAC:ArrayCollection=new ArrayCollection(); ??? public function init() : void ??????????? {????????????????? ??????????????? indexMenu.send();?????????????????? ??????????? }???? ??? private function httpIndexMenuResult(event:ResultEvent):void ??????????? { ??????????? var menuXml:XML=event.result as XML; ??????????? trace("xml",menuXml.city.length()); ??????????????? for (var i:int=0;i<menuXml.city.length();i++) ??????????????? { ??????????????? var obj:Object = new Object(); ??????????????????? obj.name = menuXml.city[i].@name; ??????????????????? obj.lon = menuXml.city[i].@lon; ??????????????????? obj.lat = menuXml.city[i].@lat; ??????????????????? obj.src = menuXml.city[i].@src; ??????????????????? obj.txt = menuXml.city[i].@txt; ??????????????????? menuAC.addItem(obj); ?????????????????? } ??????????? }?????? ?????????????? ?????????????? for(var k:int=0;k<menuAC.length;k++) ??????????????? {??????????????????????? ????????????????? var tempO:Object = menuAC.getItemAt(k); ????????????????????????????????????????????????? ?????????????????????? trace("1",tempO.name);??????? ????????????????????? /*结果为 ?????????????????? 1 呼和浩特 ?????????????????? 1 广州 ?????????????????? 1 深圳???? */?????????????? ??????????????? }???? ????????????? }???? public function menuJumpTo(event:MouseEvent):void ???????????? {??? ??????????????? var toUrl:String = (event.target as Button).data.menu_url;??? ??????????????? navigateToURL(new URLRequest(toUrl),"_blank");?????????????? ??????????? }??? ??? ]]> ??? </mx:Script> </mx:Application> =========================== flex XML,XMLList,XMLListCollection之间的关系笔记2010-10-11 12:18通常情况下,你可以从服务器上为tree控件取得XML数据 ,你也可以在<mx:Tree>Tag里直接定义格式良好的XML数据。 你可以使用<mx:XML>或者<mx:XMLList>Tag在mxml里定义XML数据。 你可以将XML object直接作为一个层级数据控件的dataProvider,however,if the object changes dynamically,你应该做如下处理: 1,将XML或者XMLList objects转换为XMLListCollection; 2,通过修改XMLListCollection数据来更新原始的XML数据; XMLListCollection支持IList和ICollectionView两个接口,所以它能实现access,sort,filter等等操作: get,set,add,remove 同时支持IViewCursor接口,于是可以实现Cursor功能: 一个Array,ArrayCollection,ICollectionView和IViewCursor之间的关系的例子如下: var myAC:ArrayCollection=new ArrayCollection(myArray); var myCursor:IViewCursor=myAC.CreateCursor(); while(!myCursor.afterLast){myCursor.moveNext();} 以下例子显示了两个Tree,一个使用XML作为数据源,一个使用XMLListCollection作为数据源 <?xml version="1.0"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> ??? <mx:XML id="capitals"> ??????? <root> ??????????? <Capitals label="U.S. State Capitals"> ??????????????? <capital label="AL" value="Montgomery"/> ??????????????? <capital label="AK" value="Juneau"/> ??????????????? <capital label="AR" value="Little Rock"/> ??????????????? <capital label="AZ" value="Phoenix"/>??????? ??????????? </Capitals> ??????????? <Capitals label="Canadian Province Capitals"> ??????????????? <capital label="AB" value="Edmonton"/> ??????????????? <capital label="BC" value="Victoria"/> ??????????????? <capital label="MB" value="Winnipeg"/> ??????????????? <capital label="NB" value="Fredericton"/> ??????????? </Capitals> ??????? </root> ??? </mx:XML> ??? <!-- Create an XMLListCollection representing the Tree nodes. ??????????? 多个capitals.Capitals组成XMLList,因为Capitals里还nest了其他 child elements. --> ??? <mx:XMLListCollection id="capitalColl" source="{capitals.Capitals}"/> ??? <!-- When you use an XML-based data provider with a tree you must specify ??????? the label field,even if it is "label". ??????? The XML object includes the root,so you must set showRoot="false". ??????? Remember that the Tree will not,by default,reflect dynamic changes ??????? to the XML object. --> ??? <mx:Tree id="Tree1" dataProvider="{capitals}" labelField="@label" showRoot="false" width="300"/> ??? <!-- The XMLListCollection does not include the XML root. --> ??? <mx:Tree id="Tree2" dataProvider="{capitalColl}" labelField="@label" width="300"/> </mx:Application> 从上面的例子可以看出,E4X标准的XML数据必须具有一个根节点,而为了阻止这个根节点在类似tree或者Menu-Based这样的层级数据显示控件显示根节点呢,我们必须设置showRoot属性为false;其次,当您使用XML,XMLList,XMLListCollection作为类似tree数据显示控件的数据源的时候,你 必须明确指定这些控件的labelField 属性,即使XMLattributes里有一个label,You must do this because you must use the @ sign to signify an attribute! XMLListCollection提供对数据源的dynamically updates,但是XMLList和XML不行。addItem,addItemAt,setItemAt,getItemIndex,removeItemAt XMLListCollection的CollectionEvent事件:public function collectionEventHandler(event:CollectionEvent):void {????????? switch(event.kind) {????????????? case CollectionEventKind.ADD:????????????????? addLog("Item "+ event.location + " added");????????????????? break;????????????? case CollectionEventKind.REMOVE:????????????????? addLog("Item "+ event.location + " removed");????????????????? break;????????????? case CollectionEventKind.REPLACE:????????????????? addLog("Item "+ event.location + " Replaced");????????????????? break;????????????? case CollectionEventKind.UPDATE:????????????????? addLog("Item updated");????????????????? break;????????? }}<mx:ArrayCollection id="ac"???????????? collectionChange="collectionEventHandler(event)" /> -------------------------------------------------------------------- <?xml version="1.0"> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" height="400"> ??? ??? <mx:Script> ??? <![CDATA[ ??????? import mx.collections.XMLListCollection; ??????? import mx.collections.ArrayCollection; ??? ??????? // An XML object with categorized produce. ??????? [Bindable] ??????? public var myData:XML= ??????????? <catalog> ??????????????? <category name="Meat"> ??????????????????? <product name="Buffalo" cost="4" isOrganic="No" ??????????????????????? isLowFat="Yes"/> ??????????????????? <product name="T Bone Steak" cost="6" isOrganic="No" ??????????????????????? isLowFat="No"/> ??????????????????? <product name="Whole Chicken" cost="1.5" isOrganic="Yes" ??????????????????????? isLowFat="No"/> ??????????????? </category> ??????????????? <category name="Vegetables"> ??????????????????? <product name="Broccoli" cost="2.16" isOrganic="Yes" ??????????????????????? isLowFat="Yes"/> ??????????????????? <product name="Vine Ripened Tomatoes" cost="1.69" isOrganic="No" ??????????????????????? isLowFat="Yes"/> ??????????????????? <product name="Yellow Peppers" cost="1.25" isOrganic="Yes" ??????????????????????? isLowFat="Yes"/> ??????????????? </category> ??????????????? <category name="Fruit"> ??????????????????? <product name="Bananas" cost="0.95" isOrganic="Yes" ??????????????????????? isLowFat="Yes"/> ??????????????????? <product name="Grapes" cost="1.34" isOrganic="No" ??????????????????????? isLowFat="Yes" /> ??????????????????? <product name="Strawberries" cost="2.5" isOrganic="Yes" ??????????????????????? isLowFat="Yes"/> ??????????????? </category> ??????????? </catalog>; ??????? ??????? // An XMLListCollection representing the data for the shopping List. ??????? [Bindable] ??????? public var listDP:XMLListCollection = new XMLListCollection(new XMLList()); ??? ??????? // Add the item selected in the Tree to the List XMLList data provider. ??????? private function doTreeSelect():void ??????? { ??????????? if (prodTree.selectedItem) ??????????????? listDP.addItem(prodTree.selectedItem); ??????? } ??????? // Remove the selected in the List from the XMLList data provider. ??????? private function doListRemove():void ??????? { ??????????? if (prodList.selectedItem) ??????????????? listDP.removeItemAt(prodList.selectedIndex); ??????? } ??? ]]> ??? </mx:Script> ??? ??? <mx:Tree id="prodTree" dataProvider="{myData}" width="200" ??????? showRoot="false" labelField="@name"/> ??????? ??? <mx:HBox> ??????? <mx:Button id="treeSelect" label="Add to List" ??????????? click="doTreeSelect()"/> ??????? <mx:Button id="listRemove" label="Remove from List" ??????????? click="doListRemove()"/> ??? </mx:HBox> ??????? ??? <mx:List id="prodList" dataProvider="{listDP}" width="200" ??????? labelField="@name"/> </mx:Application>
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读