SOAP基于XML,访问起来不是很方便(使用E4x例外),如何将Web Service中的的XML对象或XMLList对象转换为AS3强类型对象或对象集合呢?比较常用的有两个解决方案:一是使用SchemaTypeRegistry.registerClass()方法通过使用限定命名空间来注册类。二是使用XMLDecoder类将XML转换为AS3对象。
使用SchemaTypeRegistry.registerClass()方法
SchemaTypeRegistry.registerClass()方法让你注册类,这个类是基于Web Service返回的类型。这个类一定要在WSDL文件中描述,WSDL文件描述了Web Service的所有方法和类型。例如,一个名为Person对象的对应的Schema片段如下:
代码如下 | 复制代码 |
|
注意:服务的类型被定义为tns:Person,这表明该服务将返回前面代码定义的Person对象。SchemaTypeRegistry用于声明映射,这个映射将Web Service的Person对象转换为AS3强类型对象。这个方法需要一个限定命名空间的对象(QNmae)和一个类对象,这个AS3的类对象代表了Web Service返回的Person。
代码如下 | 复制代码 |
var qname:QName = new QName("http://www.111com.net/", "Person"); |
Person类生成具有公共属性的简单值对象表示Person对象所需的数据。
代码如下 | 复制代码 |
package com.riafan.model { public class Person { public var name:String; public var age:uint; public var married:Boolean; } } |
注册类型之后,Web Service返回的对象将被转换为Person类型,你可以使用这个强类型的对象工作,而无需AMF服务。这个方法需要强类型对象对应的Schema,因此不是很通用。另外在使用SOAP查找Schema很费时,因此该方法不高效。
使用xmlDecoder.decode()方法
该方法使用E4x方式访问XML(不只是Saop),再将其转换为AS3强类型对象的。因此它比前一种方法通用有效。XmlDecoder类不存在Flex自带的API中,如果你安装有Flex Bulder,可以在eclipsepluginscom.adobe.flexbuilder.project_xxxdcradSwcsxxxlibsserializers.swc中找到该类。当然你也可以在我分享的源文件包中找到它们。
decode()方法第一个参数是要解析的xml对象,因此RPC服务返回的结果数据类型通常为e4x,第二个参数是对应的AS3的强类型。第三个参数查找要用的XPath,可见其高效。当需要将XMLList转换强类型对象的ArrayCollection时,需要将第四个参数设置为true。最后一个参数指定该AS3对象可否绑定。
代码如下 | 复制代码 |
var ac:ArrayCollection = xmlDecoder.decode(event.result[0] as XML, Person, "getListResponse/getListResult/Person", true, true) as ArrayCollection; dg.dataProvider = ac; |
注意:这种方案是直接对XML进行解析的,不能直接处理Date数据类型,因为它是将其看作是String类型。
创造与魔法 安卓版v1.0.0750
创造与魔法是一款开放世界手游,在游戏中玩家可探索这个奇妙的世
创造与魔法修改版 最新版v1.0.0750
创造与魔法无限点券版是款探索冒险游戏,该款游戏的操作还是蛮自
战争与文明官方版本 安卓版v1.7.16
战争与文明是一款由上海邮通科技有限公司开发的战争策略游戏,这
迷你世界0元领皮肤无限迷你币版 最新安卓版v1.43.0
迷你世界0元购买皮肤版是这款开放沙盒冒险建造游戏的特殊破解版
创造与魔法无限经验版 安卓版v1.0.0750
创造与魔法无限经验版是款可以改造环境,整个游戏的自由度还是蛮