将Web Service中的XML转换为AS3强类型对象

Web Service访问速度很慢,但有时不得不基于已有的Web Service开发Flash应用。大家都知道,Web Service是基于SOAP通信协议在HTTP之上进行信息交换。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片段如下:

<complexType name="Person">
  <s:sequence>
    <s:element name="name" type="s:string" maxOccurs="1" minOccurs="0"/>
    <s:element name="age" type="s:unsignedInt" maxOccurs="1" minOccurs="1"/>
    <s:element name="married" type="s:boolean" maxOccurs="1" minOccurs="1"/>
  </s:sequence>
</s:complexType>

注意:服务的类型被定义为tns:Person,这表明该服务将返回前面代码定义的Person对象。SchemaTypeRegistry用于声明映射,这个映射将Web Service的Person对象转换为AS3强类型对象。这个方法需要一个限定命名空间的对象(QNmae)和一个类对象,这个AS3的类对象代表了Web Service返回的Person。

var qname:QName = new QName('http://www.riafan.com/', 'Person');
mx.rpc.xml.SchemaTypeRegistry.getInstance().registerClass(qname, 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,可以在eclipse\plugins\com.adobe.flexbuilder.project_xxx\dcradSwcs\xxx\libs\serializers.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类型。

点击此处查看该实例最终效果,点击此处下载该实例的源码。

本实例用到的Web Service:http://www.riafan.com/services/IntroService.asmx

发表评论