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

作者:袖梨 2022-06-28

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");
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,可以在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类型。

相关文章

精彩推荐