- 浏览: 84138 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
cjl_future:
非常感谢,顶顶顶,终于解决此问题了
extJS checkboxselectionmodel 默认选中 -
gaoke:
呵呵,共同提高,相互学习,分享是件快乐的事情
extJS checkboxselectionmodel 默认选中 -
chenglnb:
太谢谢了,解决困扰我好长时间的我一大难题,原来是个bug
extJS checkboxselectionmodel 默认选中 -
xanderzhang:
不好用 。 我的titlewindow 在module里面
flex sdk 4 在Module中弹出TitleWindow,结果失败!?为何
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>
元素: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>
发表评论
-
Google Maps API及相关站点
2013-01-14 16:35 679Google Maps API: https://develo ... -
flex 编译优化
2011-06-09 09:12 174022.12.1.问题 我想减小文 ... -
flex 安全沙箱
2011-06-09 09:11 1230关于安全沙箱 安全沙箱包括:远程沙箱与本地沙箱。其实这个沙箱 ... -
ActionScript 3 和 Flex框架的性能优化
2011-04-13 18:00 841与其在程序写完了之后臃肿得跑不动,不如平时注意这些关键点,时时 ... -
flex sdk 4 在Module中弹出TitleWindow,结果失败!?为何
2011-04-04 16:04 1258在编译设置里面加入 -keep-all-type-select ... -
blazeDS services-config
2011-04-01 09:54 1387<?xml version="1.0" ... -
flex checkboxlist
2011-03-30 09:59 1029package com.components.checkBox ... -
Flex在eclipse调试以及输出Debug信息到文件设置
2011-03-30 09:55 1619在eclipse调试 首先安装调试版flashplayer, ...
相关推荐
flex 的xml操作xml操作xml操作xml操作xml操作xml操作xml操作xml操作
Flex与JSON及XML的互操作,一篇Info的文章。
通过Httpserver与读取本地XML文件
flex 操作xml 实现增删改查flex 操作xml 实现增删改查flex 操作xml 实现增删改查flex 操作xml 实现增删改查flex 操作xml 实现增删改查
flex读取xml文件的数据的三种方式及其比较
flex解析xml
Ajax struts2 xml flex Ajax struts2 xml flex Ajax struts2 xml flex Ajax struts2 xml flex Ajax struts2 xml flex Ajax struts2 xml flex
使用httpService通过xml传递对象的时候,用于flex端解析xml的实例。
FLEX操作XML&JSON,是一篇翻译过来的文章.原文是INFOQ上的一篇文章.原文地址为: http://www.infoq.com/articles/flex-xml-json
flex xml 生成 tree 的详细源码 。还有解说
Flex之URLLoader加载XML 使用URLLoader加载XML
flex xml 生成
flex 读XML 写XML 并保存为xml文件,由图生成Xml文件,由XMl文件生成图
本文主要是我对Flex学习的总结,以供大家学习参考。
flex解析xml实例,可读取xml标签来获取信息,并附表情
这是使用flex解析xml文件,并将xml文件的内容作为ComboBox下拉列表的数据提供源
flex 解析xml文件,利用httpservice读取xml文件,按要求过滤字符串,获取对应的值
Flex-radarChart总结,Flex-radarChart总结
Flex读取XML不刷新问题
flex外部读取xml