flex xml 操作总结

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值