`
it_liuyong
  • 浏览: 97165 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flex中操作XML

    博客分类:
  • flex
 
阅读更多
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,,7,,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", null, 7, undefined, "c"];  /* 显示: <example> <someElement number="12.1" string="example" boolean="true" array="a,,7,,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="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带来的便利
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,you can do it with me ,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,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>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:\FlexDemo\bin-debug\content.xml"
注:这里的url只是在单纯的Flex工程中使用的方法,
如果使用tomcat的话,就只能写成url="content.xml"和url="http://localhost:8080:FlexDemo\bin-debug\content.xml"
如果写成url="http://IP或是外网:8080:FlexDemo\bin-debug\content.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>


分享到:   .flex 安全沙箱 | flex 常识 2011-06-09 09:09:45浏览 236评论(0)分类:Web前端相关推荐评论发表评论
您还没有登录,请您登录后再发表评论

gaoke
浏览: 3233 次
性别:
来自: 北京

最近访客 更多访客>>
kredingsnowolflyingweizhouyueking114963349.文章分类
■全部博客 (29)
■Java (7)
■Flex (8)
■Middleware (1)
■JMS (1)
■JS (2)
■DB (4)
■RIA (1)
■BI (1)
■IDE (1)
■Others (1)
社区版块
■我的资讯 (0)
■我的论坛 (0)
■我解决的问题 (0)
存档分类
■2011-07 (1)
■2011-06 (3)
■2011-05 (2)
■更多存档...
评论排行榜
■flex sdk 4 在Module中弹出TitleWindow, ...
最新评论
xanderzhang: 不好用 。 我的titlewindow 在module里面
flex sdk 4 在Module中弹出TitleWindow,结果失败!?为何
.
--------------------------------------------------------------------------------
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。
© 2003-2011 ITeye.com. All rights reserved. [ 京ICP证110151号 京公网安备110105010620 ] .
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics