`
prospong
  • 浏览: 880 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

(转)flex 数据基础-使用XML和XMLList

阅读更多
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里解析XML数据

    总结,Flex提供了丰富的API和特性来处理XML数据,包括XML类、E4X语法、XMLList以及各种加载和解析工具。理解并熟练运用这些技术,能帮助开发者更好地在Flex应用中实现数据的交互和展示。在实际开发中,结合源码分析...

    Flex:ArrayCollection转xml形式的实例

    另一方面,如果从服务器接收XML数据,也可以通过反向操作将XML转换为ArrayCollection,以便在Flex或Flash应用中使用。 在实际项目中,你可能还需要考虑更多细节,如XML的命名空间管理、属性的添加以及错误处理等。...

    Flex之URLLoader加载XML

    - `var results:XMLList = menus.node` 获取XML文件中所有 `&lt;node&gt;` 元素。 - `tree.dataProvider = results` 将XML数据绑定到Tree组件,使其显示在界面上。 - `for` 循环遍历所有的子节点,并通过 `attribute(...

    Flex基础培训-6-拖放与过滤

    var filteredData:XMLList = xmlData.employee[@age='18']; // 遍历过滤后的数据 for each (var employee:XML in filteredData) { trace("Name: " + employee.name); } ``` 这段代码首先将原始XML字符串转换为XML...

    flex-xml合并,树查找xml

    同时,还可以使用XMLList的concat()方法将多个XMLList对象组合成一个新的XMLList。 接下来,我们讨论无限级别的树查找。在XML树中,每个节点都可以有任意数量的子节点,形成了一种层级结构。为了在这样的结构中进行...

    Flex基础培训-3-组件和布局

    1. **DataGrid组件**:DataGrid是Flex中用于显示和管理表格数据的关键组件。它允许开发者展示数据集合,并且可以与后端数据源进行绑定。开发者可以通过DataGrid组件实现复杂的数据操作功能,如拖拽列标题来自定义列...

    flex解析xml

    总结,Flex解析XML文件主要通过XML和XMLList类,它们提供了丰富的API来操作XML数据。理解这些概念和方法,将有助于你在Flex应用中有效地处理和展示XML数据。无论是简单的数据展示还是复杂的交互逻辑,Flex都能通过...

    Flex中Tree组件的数据源举例(xml,array,object)

    理解如何正确设置和使用这些数据源,是构建功能丰富的Flex应用程序的关键步骤之一。在"tree_dataProvider.mxml"文件中,你可以找到关于这个主题的具体示例代码,帮助你更好地理解和实践这些概念。

    Flex数据共享与压缩

    在Flex开发中,数据管理是核心任务之一,尤其是在处理大量数据时。"Flex数据共享与压缩"的...通过使用数据压缩和分片存储技术,我们可以确保Flex应用在面对XMLList等大数据结构时仍能保持良好的运行效率和用户体验。

    flex 解析xml文件 httpservice

    在Flex开发中,XML文件常被用作数据存储和传输的格式,因为它结构清晰、易于理解和操作。本篇文章将深入探讨如何使用Flex解析XML文件,并通过HTTPService来读取XML内容,以及如何根据需求过滤字符串并获取所需值。 ...

    Flex DataGrid从XML文件中加载数据

    在Flex编程中,`Flex DataGrid` 是一个用于展示数据集的组件,它允许用户以表格形式查看和操作数据。本示例展示了如何从XML文件加载数据并将其显示在Flex DataGrid中。以下是对该话题的详细解释: 1. **XML数据源**...

    Flex_JSON_XML.zip_flex

    - **Flex解析XML**:在Flex中,我们可以使用`XML`类和`XMLList`类来处理XML数据。它们提供了方便的方法来查询、修改和操作XML文档。 - **Java生成XML**:在Java端,可以使用DOM、SAX或StAX等API来生成和解析XML。...

    Flex Tree 通过Arraycollection转化为XML数据源,新增、删除、修改功能的整合

    要将ArrayCollection转换为XML,我们可以利用Flash的内置类`XMLList`和`XML`。例如,如果ArrayCollection中的每个项包含一个ID和名称属性,可以这样转换: ```actionscript var xmlData:XML = new XML(); for each ...

    flex 解析xml实例

    7. **XML和AMF**:在Flex中,XML也可以与Action Message Format (AMF)一起使用,AMF是一种高效的序列化格式,常用于Flex与服务器之间的数据交换。 在提供的压缩包文件中,`.actionScriptProperties`、`....

    flex 解析xml绑定到combobox点击按钮把combobox所选的数据添加到List

    在Flex开发中,数据绑定和用户交互是两个关键部分,本示例主要展示了如何将XML数据解析并绑定到ComboBox控件,以及如何通过点击Button按钮将ComboBox选定的值添加到List列表中。以下是对这个小例子的详细解释: 1. ...

    Flex Demo XML JSON

    1. **XML处理**:Flex提供了一套完整的XML处理库,包括XML类和XMLList类。通过这些类,开发者可以方便地创建、解析和操作XML文档。例如,你可以使用`new XML(xmlString)`来实例化一个XML对象,然后通过属性和方法如`...

    flex上:简单的将xml内容生成文件存到本地的一个小例子

    在Flex中,XML可以作为一个变量、对象或者通过XMLList来处理。XML对象提供了丰富的API,如addChild、toString等,使得在程序中操作XML变得简单。 2. **XML内容生成**: 在描述中提到的示例中,首先可能创建了一个...

    Flex类图和与Java交互时类型转换对照

    - org.w3c.dom.Document,org.xml.sax.InputSource等:用于处理XML数据的类,与Flex的XML和XMLList相关。 3. 类型转换过程: - 当Flex向Java发送数据时,Flex的Number类型会被转换为Java的double类型,String、...

    Flex tree的用法

    - **XMLList和XMLListCollection**: 将XML转换为XMLList或XMLListCollection,然后设置给Tree的`dataProvider`属性,这样就可以显示XML数据。 - **节点标签和子节点**: XML元素的文本可以作为节点的标签,而子元素...

    向Tree空间添加删除XML数据节点_Flex4

    1. **XML解析和创建**: 在Flex中,可以使用XML类来创建和操作XML数据。例如,你可以通过以下方式创建一个简单的XML对象: ```actionscript var xmlData:XML = &lt;root&gt;&lt;item id="1"&gt;Item 1&lt;/item&gt;&lt;item id="2"&gt;Item 2...

Global site tag (gtag.js) - Google Analytics