flex 数据基础-使用XML和XMLList
2010-12-15 11:05
本文引自“民工甲”的文章: http://hi.baidu.com/diwu0510/blog/item/eb985ffb7248cb989f514653.html
flex的一个特性是数据驱动。这么说不太清楚,举个例子吧,在网页里做一个数据表格,要先画好表格结构然后把数据填进去,而在flex里则是为datagrid指定一个数据源,数据源的结构决定了datagrid的呈现样式。很多时候数据源是XML和XMLList充当的,所以了解XML和XMLList还是有很有必要的。
一般情况下,由数据端语言生成XML或XMLList提供给Flex,由Flex直接使用或转换成ArrayCollection展现数据。
那么XML和XMLList有什么区别呢,很简单,看是否含有根节点。举例来说:
<root>
<node type="student" name="学生一">
<node type="student" name="学生二">
<node type="teacher" name="老师一">
</root>
这就是一个典型的XML,其中<root>是根节点,<node>是子节点。type,name是属性名,等号右边是属性值。而
<node type="student" name="学生一" />
<node type="student" name="学生二" />
<node type="teacher" name="老师一" />
这一部分就是一个XMLList。
好了,知道了什么是XML和XMLList,下面看怎么使用他们。
1、使用AS创建XML
前面的代码不罗嗦,直接看script里的
<mx:Script>
<![CDATA[
Private var myData:XML;
private function initApp():void
{
myData = <root>
<node type="student" name="小花" />
<node type="student" name="小龙" />
<node type="student" name="小刚" />
</root>
}
]]>
</MX:Script>
注意一下,这是比较基础的flex特性,全局变量可以在函数体外定义,但实例话对象并赋值这个过程必须在函数体内进行,不然会报错说变量未定义。用上面的代码举例:
Private var myData:XML = new XML();
myData = <root>
……
</root>
这样写代码,OK,保存的时候就会提示变量未定义。创建一个function,在函数体内为myData赋值才是正确的。
其实也可以在声明变量的时候直接赋值,也不会报错,如下:
Private var myData:XML = <root>
……
</root>
在函数内调用myData也不会任何问题。
ok,言归正传,我们在initApp()这个函数里为myData赋值,也就是说必须运行initApp()这个函数才能使用,为了能自动为myData赋值,还需要在windowedApplication标签加入creationComplete="initApp()",作用是在程序初始化结束后会执行initApp()这个函数。
另外,这种方式只能定义XML,既必须有根节点,不能定义XMLList。
除了直接给XML变量赋值外,还可以使用构造函数,如下:
<mx:Script>
<![CDATA[
private var myData:XML;
private function initApp():Void
{
var myStr:String = "<root>
……
</root>"
myData = new XML(myStr);
}
]]>
</mx:Script>
这种形式要注意下XML中的引号要换成单引号。
2、用标签创建XML/XMLList
废话不说,直接看标签代码
<mx:XML id="myData">
<root>
<node type=……
</root>
</mx:XML>
注意啊, 在flex4里,直接插入这个标签是会报错的,正确的做法应该是在<mx:XML>外增加一个父标签<fx:Declarations>。
同样的定义XMLList,只是没有<root>标签而已,不啰嗦。
3、输出XML某一类节点
非常简单,,可以直接使用点语法,看例子:
假设有这样一个XML,要取节点名为girl的子节点组成的XMLList,如下:
private var myData:XML = <student>
<boy name="小刚"/>
<boy name="小刚"/>
<girl name="小花"/>
<girl name="小兰"/>
</student>
private var girls:XMLList ;
private function initApp():Void
{
girls = myData.girl;
trace(girls);
}
注意这个地方,如果名为girl的节点只有一个,系统会报错,后面会解释。
XML对象跟节点相关的功能总结下,简单,不多解释,记住就好:
1) 获取全部节点 myData.elements("*")
2) 按节点名称获取节点 myData.elements("node")
3) 获取节点下的所有所有节点 myData.node[0].elements() 第一个node节点下的所有内容,比如说:
<root>
<node>
<child name="john"/>
<childe name="Tom"/>
</node>
</root>
显示的就是
<child name="john"/>
<childe name="Tom"/>
4) 单条数据的情况,注意,下面一段呼应上面的红色内容:
myData2 = <root>
<boy name="数据2"/>
</root>
trace(myData2.elements()) 怎么显示呢?嘿嘿,没错,就是啥都没有,为啥?这里说一下Flex的一个默认的情况,如果XML元素只有一个节点,那么Flex默认输出其节点内容而不是把节点整个显示出来,而结点内容为空,自然就啥都显示不出来了。下面的情况会有所不同:
myData3 = <root>
<boy name="数据2">这个节点有内容了</boy>
</root>
trace(myData3.elements()); 什么情况呢?没错,就是会显示 “这个节点有内容了”这行字。
是不是单行节点无法显示整个XMLList内容呢?当然不是,只要这样就可以了:
trace(myData2.elements().toXMLString());
5) 获取下级节点的个数 myData.elements().length()
这里这么写也没什么问题,不过事实上没这么简单。举个例子吧:
<root>
<people type="student">
<boy name="小刚"/>
<girl name="小花"/>
</people>
<people type="teacher" name="老师"/>
<class name="小5班"/>
</root>
好,如果要查看root下所有二级子节点的个数,myData.elements().length()没有问题,显示的值为3;
如果要获取root下所有后代的个数,就应该这样写 myData.descendants("*").length(),显示值为5;
注意啊,这个descendants("*")返回的也是XMLList,不过返回的值很有意思,没事儿可以测试下,这里只说length相关,就不啰嗦了。
6) 获取节点名字 myData.elements()[0].name() 不解释
获取节点内容 myData.elements()[0] 也可以用myData.elements()[0].text();
7) 获取父节点 节点名.parent() myData.element[0].childe[0].parent().@name 其实就是element[0]的name属性
8)取得属性值和属性名 myData.node[0].@name myData第一个节点的属性name的值等价于myData.node[0].attribute("name"),读取全部的值myData.node[0].atttibute("*")
9) 对XML按条件过滤 myData.elements()[0].(@name=="Tom"),注意如果myData下的子孙节点有的没有@name这个属性,将取不到任何信息。
10)添加节点组合生成XML
myData.appendChild(<node ……/>),这是在最后添加一个节点
myData.prependChild(<node....../>),这是在最前面田间一个节点
myData.insertChildAfter(myData.node[0],<node ..../>),这是在第一个节点后面添加
myData.insertChildBefore(myData.node[0],<node ..../>),这是在第一个节点前面添加
myData.newElement=<node ....../>
myData.newElement=<node ......>内容</node>
myData.node[1] = "aaa" 有这个节点就修改节点的内容,没有的话就创建一个节点
节点名字可以由变量组成 var bl:int=2; myData["node"+bl] = "name";
写一个用数组构成XML的例子:
private function buildXML():Void
{
var ids:Array = [121,122,123];
var names:Array = [["a1","a2"],["b1","b2"],["c1","c2"]];
var arrData:XML = new XML("<root></root>");
for(var i:int=0; i<ids.length;i++)
{
var node:XML = new XML();
node = <employee id={ids[i]}>
<last>{names[i][0]}</last>
<first>{names[i][0]}</first>
</employee>
arrData.appendChild(node);
}
}
11) 添加、修改节点属性
myData.node[1].@name="aaa" 有name属性则属性值改为aaa,没有就创建一个name属性
也可以动态添加属性,比如说用循环
for(var i:int=0; i<3; i++)
{
myData.node[1].@["name"+i] = "tom";
}
12) 删除节点和属性
删除节点 delete myData.node[1]; 注意,这里可以删除多个节点
删除属性 delete myData.node[1].@name 注意,这里同样可以删除多个
删除所有属性,需要使用循环
var attri:XMLList = myData.node.@*;
4、读取外部XML/XMLList
1)使用XML标签 <mx:XML source="data/xml.xml" id="myData">
2)使用URLLoader,在Action中加载
import flash.net.URLLoader;
import flash.net.URLRequest;
private function loadXML():Void
{
var request:URLRequest = new URLRequest("data/xml.xml");
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE,completeHander);
loader.load(request);
}
private function completeHander(e:Event):Void
{
var myData2:XML = new XML(e.target.data);
}
如果在变异过程中出现错误提示“无法访问本地资源....”,需要设置编译参数:-use-netwrok = false
3)使用HTTPService,看代码:
import mx.rpc.events.ResultEvent;
private function initApp():Void
{
ser.send();
}
private function resultHandler(e:ResultEvent):woid
{
var myData3:XML = e.result asXML;
trace(myData3);
声明HTTPService标签
<mx:HTTPService id="ser" url="data/xml.xml" result="resultHandler(event)" resultFormat="e4x"/>
}
分享到:
相关推荐
总结,Flex提供了丰富的API和特性来处理XML数据,包括XML类、E4X语法、XMLList以及各种加载和解析工具。理解并熟练运用这些技术,能帮助开发者更好地在Flex应用中实现数据的交互和展示。在实际开发中,结合源码分析...
另一方面,如果从服务器接收XML数据,也可以通过反向操作将XML转换为ArrayCollection,以便在Flex或Flash应用中使用。 在实际项目中,你可能还需要考虑更多细节,如XML的命名空间管理、属性的添加以及错误处理等。...
- `var results:XMLList = menus.node` 获取XML文件中所有 `<node>` 元素。 - `tree.dataProvider = results` 将XML数据绑定到Tree组件,使其显示在界面上。 - `for` 循环遍历所有的子节点,并通过 `attribute(...
var filteredData:XMLList = xmlData.employee[@age='18']; // 遍历过滤后的数据 for each (var employee:XML in filteredData) { trace("Name: " + employee.name); } ``` 这段代码首先将原始XML字符串转换为XML...
同时,还可以使用XMLList的concat()方法将多个XMLList对象组合成一个新的XMLList。 接下来,我们讨论无限级别的树查找。在XML树中,每个节点都可以有任意数量的子节点,形成了一种层级结构。为了在这样的结构中进行...
1. **DataGrid组件**:DataGrid是Flex中用于显示和管理表格数据的关键组件。它允许开发者展示数据集合,并且可以与后端数据源进行绑定。开发者可以通过DataGrid组件实现复杂的数据操作功能,如拖拽列标题来自定义列...
总结,Flex解析XML文件主要通过XML和XMLList类,它们提供了丰富的API来操作XML数据。理解这些概念和方法,将有助于你在Flex应用中有效地处理和展示XML数据。无论是简单的数据展示还是复杂的交互逻辑,Flex都能通过...
理解如何正确设置和使用这些数据源,是构建功能丰富的Flex应用程序的关键步骤之一。在"tree_dataProvider.mxml"文件中,你可以找到关于这个主题的具体示例代码,帮助你更好地理解和实践这些概念。
在Flex开发中,数据管理是核心任务之一,尤其是在处理大量数据时。"Flex数据共享与压缩"的...通过使用数据压缩和分片存储技术,我们可以确保Flex应用在面对XMLList等大数据结构时仍能保持良好的运行效率和用户体验。
在Flex开发中,XML文件常被用作数据存储和传输的格式,因为它结构清晰、易于理解和操作。本篇文章将深入探讨如何使用Flex解析XML文件,并通过HTTPService来读取XML内容,以及如何根据需求过滤字符串并获取所需值。 ...
在Flex编程中,`Flex DataGrid` 是一个用于展示数据集的组件,它允许用户以表格形式查看和操作数据。本示例展示了如何从XML文件加载数据并将其显示在Flex DataGrid中。以下是对该话题的详细解释: 1. **XML数据源**...
- **Flex解析XML**:在Flex中,我们可以使用`XML`类和`XMLList`类来处理XML数据。它们提供了方便的方法来查询、修改和操作XML文档。 - **Java生成XML**:在Java端,可以使用DOM、SAX或StAX等API来生成和解析XML。...
要将ArrayCollection转换为XML,我们可以利用Flash的内置类`XMLList`和`XML`。例如,如果ArrayCollection中的每个项包含一个ID和名称属性,可以这样转换: ```actionscript var xmlData:XML = new XML(); for each ...
7. **XML和AMF**:在Flex中,XML也可以与Action Message Format (AMF)一起使用,AMF是一种高效的序列化格式,常用于Flex与服务器之间的数据交换。 在提供的压缩包文件中,`.actionScriptProperties`、`....
在Flex开发中,数据绑定和用户交互是两个关键部分,本示例主要展示了如何将XML数据解析并绑定到ComboBox控件,以及如何通过点击Button按钮将ComboBox选定的值添加到List列表中。以下是对这个小例子的详细解释: 1. ...
1. **XML处理**:Flex提供了一套完整的XML处理库,包括XML类和XMLList类。通过这些类,开发者可以方便地创建、解析和操作XML文档。例如,你可以使用`new XML(xmlString)`来实例化一个XML对象,然后通过属性和方法如`...
在Flex中,XML可以作为一个变量、对象或者通过XMLList来处理。XML对象提供了丰富的API,如addChild、toString等,使得在程序中操作XML变得简单。 2. **XML内容生成**: 在描述中提到的示例中,首先可能创建了一个...
- org.w3c.dom.Document,org.xml.sax.InputSource等:用于处理XML数据的类,与Flex的XML和XMLList相关。 3. 类型转换过程: - 当Flex向Java发送数据时,Flex的Number类型会被转换为Java的double类型,String、...
- **XMLList和XMLListCollection**: 将XML转换为XMLList或XMLListCollection,然后设置给Tree的`dataProvider`属性,这样就可以显示XML数据。 - **节点标签和子节点**: XML元素的文本可以作为节点的标签,而子元素...
1. **XML解析和创建**: 在Flex中,可以使用XML类来创建和操作XML数据。例如,你可以通过以下方式创建一个简单的XML对象: ```actionscript var xmlData:XML = <root><item id="1">Item 1</item><item id="2">Item 2...