19.10.从Web服务中把XML译码成为强类型对象

19.10.1. 问题
如何将一个XML 或XMLList 对象转换成一个或多个强类型的对象。
19.10.2. 解决办法
通过使用限定命名空间及SimpleXMLDecoder 类把XML 译码成对象, 然后使用chemaTypeRegistry.registerClass 方法对类进行注册。
19.10.3. 讨论
SchemaTypeRegistry.registerClass 可以让你注册一个类型为由Web 服务所返回的类。这个类一定要在WSDL 文件被描述, 而有关的方法及类型亦会在该文件中被描述。例如, 一个名为”Plant”的对象的所有属性定义为:
+展开
-XML
<types>
<xsd:schema targetNamespace="http://localhost/ns/ws
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:complexType name="Plant">
<xsd:sequence>
<xsd:element maxOccurs="1minOccurs="1name="commonnillable="truetype="xsd:string"/>
<xsd:element maxOccurs="1minOccurs="1name="botanicalnillable="truetype="xsd:string"/>
<xsd:element maxOccurs="1minOccurs="1name="zonenillable="truetype="xsd:string"/>
<xsd:element maxOccurs="1minOccurs="1name="lightnillable="truetype="xsd:string"/>
<xsd:element maxOccurs="1minOccurs="1name="pricenillable="truetype="xsd:string"/>
<xsd:element maxOccurs="1minOccurs="1name="availabilitynillable="truetype="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</types>

该方法会返回一个像以下的Plant 对象:
+展开
-XML
<binding name="PlantServicetype="tns:Plant">
<soap:binding style="rpctransport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getPlants">
<soap:operation soapAction="getPlants"/>
<input>
<soap:body use="encodedencodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://localhost/ns/ws"/>

<soap:header message="tns:getPlantspart="headeruse="literal"/>
</input>
<output>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/namespace="http://localhost/ns/ws"/>

</output>
</operation>

值得注意是, 服务类型在这里被定义为”tns:Plant”, 即表示该服务会返回一些Plant 对象, 它们跟之前代码中所定义的是一样的。SchemaTypeRegistry 通过这个声明去把Web 服务中的Plant 对象映像到对应数据的ActionScript 表示形式中。这个方法需要一个限定的Namespace和一个包含这个类的ActionScript 表示形式的Class 对象。
+展开
-ActionScript
var qname:QName = new QName("http://localhost/ns/ws""Plant");
mx.rpc.xml.SchemaTypeRegistry.getInstance().registerClass(qname,Plant);

一个简单值的对象会由Plant 类生成, 它会包含Plant 对象所需数据的公共属性。
+展开
-ActionScript
package oreilly.cookbook
{
public class Plant
{
public var common:String;
public var botanical:String;
public var zone:String;
public var light:String;
public var price:String;
public var availability:String;
}
}

当这个类完成注册后, Web 服务的结果对象会被转换成Plant 类型, 这样子你就可以直接处理强类型对象, 而无须使用AMF 服务。
+展开
-XML
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxmlwidth="400"
height="300creationComplete="init()">

<mx:WebService id="wswsdl="http://localhost/service.php?wsdl"
result="trace(event.result)"/>

<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.rpc.xml.SchemaTypeRegistry;
import mx.rpc.xml.QualifiedResourceManager;
import mx.rpc.xml.SimpleXMLDecoder;
private function init():void {
var qname:QName = new QName("http://localhost/ns/ws","Plant");
mx.rpc.xml.SchemaTypeRegistry.getInstance().registerClass(qname,Plant);
}

]]>
</mx:Script>
</mx:Canvas>

加支付宝好友偷能量挖...


评论(0)网络
阅读(104)喜欢(0)flash/flex/fcs/AIR