19.10.从Web服务中把XML译码成为强类型对象
19.10.1. 问题
如何将一个XML 或XMLList 对象转换成一个或多个强类型的对象。
19.10.2. 解决办法
通过使用限定命名空间及SimpleXMLDecoder 类把XML 译码成对象, 然后使用chemaTypeRegistry.registerClass 方法对类进行注册。
19.10.3. 讨论
SchemaTypeRegistry.registerClass 可以让你注册一个类型为由Web 服务所返回的类。这个类一定要在WSDL 文件被描述, 而有关的方法及类型亦会在该文件中被描述。例如, 一个名为”Plant”的对象的所有属性定义为:
该方法会返回一个像以下的Plant 对象:
值得注意是, 服务类型在这里被定义为”tns:Plant”, 即表示该服务会返回一些Plant 对象, 它们跟之前代码中所定义的是一样的。SchemaTypeRegistry 通过这个声明去把Web 服务中的Plant 对象映像到对应数据的ActionScript 表示形式中。这个方法需要一个限定的Namespace和一个包含这个类的ActionScript 表示形式的Class 对象。
一个简单值的对象会由Plant 类生成, 它会包含Plant 对象所需数据的公共属性。
当这个类完成注册后, Web 服务的结果对象会被转换成Plant 类型, 这样子你就可以直接处理强类型对象, 而无须使用AMF 服务。
如何将一个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="1" minOccurs="1" name="common" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="botanical" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="zone" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="light" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="price" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="availability" nillable="true" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</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="1" minOccurs="1" name="common" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="botanical" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="zone" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="light" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="price" nillable="true" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="1" name="availability" nillable="true" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</types>
该方法会返回一个像以下的Plant 对象:
+展开
-XML
<binding name="PlantService" type="tns:Plant">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getPlants">
<soap:operation soapAction="getPlants"/>
<input>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://localhost/ns/ws"/>
<soap:header message="tns:getPlants" part="header" use="literal"/>
</input>
<output>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/ns/ws"/>
</output>
</operation>
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getPlants">
<soap:operation soapAction="getPlants"/>
<input>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://localhost/ns/ws"/>
<soap:header message="tns:getPlants" part="header" use="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);
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;
}
}
{
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/mxml" width="400"
height="300" creationComplete="init()">
<mx:WebService id="ws" wsdl="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>
height="300" creationComplete="init()">
<mx:WebService id="ws" wsdl="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>
加支付宝好友偷能量挖...