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