我的 flex 代码没有正确解析肥皂响应 [英] My flex code does not parse the soap response properly
问题描述
我的代码应该解析 SOAP 响应并填充下拉列表.当我手动添加 xml 代码时,它可以工作,但是当我尝试解析 SOAP 响应时,它遇到以下错误:
My code is supposed to parse a SOAP response and populate the dropdown list. When I manually add the xml code it works but when I try to parse the SOAP response it runs into following error:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at ex1_02_starter/dropDownList_creationCompleteHandler()[C:\Users\jack\Adobe Flash Builder 4.5\Workspace\Starter 1_02\src\ex1_02_starter.mxml:26]
at ex1_02_starter/___ex1_02_starter_Operation1_result()[C:\Users\jack\Adobe Flash Builder 4.5\Workspace\Starter 1_02\src\ex1_02_starter.mxml:41]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.rpc::AbstractOperation/http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AbstractOperation.as:249]
at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::resultHandler()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:318]
at mx.rpc::Responder/result()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\Responder.as:56]
at mx.rpc::AsyncRequest/acknowledge()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:84]
at DirectHTTPMessageResponder/completeHandler()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\messaging\channels\DirectHTTPChannel.as:451]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
我收到的 SOAP 响应
The SOAP Response that I am receiving
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<mycustomersResponse xmlns="http://Services.com">
<mycustomersReturn>
<age>28</age>
<name>Alex</name>
</mycustomersReturn>
<mycustomersReturn>
<age>29</age>
<name>Jack</name>
</mycustomersReturn>
<mycustomersReturn>
<age>30</age>
<name>Johny</name>
</mycustomersReturn>
</mycustomersResponse>
</soapenv:Body>
</soapenv:Envelope>
我的 Flex 代码
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:components="components.*"
xmlns:hellos="services.hellos.*"
height="957" creationComplete="initApp()" >
<fx:Style source="Styles.css"/>
<fx:Script>
<![CDATA[
import mx.collections.XMLListCollection;
import mx.events.FlexEvent;
import mx.messaging.messages.SOAPMessage;
import mx.rpc.events.ResultEvent;
[Bindable]
var _result:*;
private function initApp():void
{
mywebservice.mycustomers();
}
protected function
dropDownList_creationCompleteHandler(event:ResultEvent):void
{
var xml:XML = event.result as XML;
var xmlString:String = xml.toXMLString();
var patt:RegExp = new RegExp("xmlns[^\"]*\"[^\"]*\"", "gi");
var newXmlString:String = xmlString.replace(patt, "");
xml = new XML(newXmlString);
_result = new XMLListCollection(xml.mycustomersResponse.mycustomersReturn);
}
]]>
</fx:Script>
<fx:Declarations>
<s:WebService id="mywebservice"
wsdl="http://localhost:8081/WebServiceTest/services/Hellos?wsdl">
<s:operation name="mycustomers"
resultFormat="object"
result="dropDownList_creationCompleteHandler(event);"
/>
</s:WebService>
</fx:Declarations>
<s:FormItem label="Label">
<s:DropDownList id="dropDownList"
labelField="name">
<s:AsyncListView list="{_result}"/>
</s:DropDownList>
</s:FormItem>
</s:Application>
推荐答案
来自这里 下拉列表未显示其值 我稍微修改了我的示例.有两个机会:
coming from here dropdown list does not show its values I slightly modified my example. There are two opportunities:
从 xml 中剥离命名空间
Strip namespace from xml
利用命名空间
分别显示在 dropDownList 和 dropDownList2 代码中.
Those are shown in dropDownList and dropDownList2 code respectively.
请注意,您不能使用仍然使用 labelField 属性的命名空间(至少我找不到方法).您必须使用 labelFunction 来提取标签.
Note, that you can not utilize namespace still using labelField property(at least I couldn't find a way). You have to use labelFunction to extract label.
<?xml version="1.0" encoding="utf-8"?>
<![CDATA[
import mx.collections.XMLListCollection;
import mx.events.FlexEvent;
import mx.messaging.messages.SOAPMessage;
[Bindable]
var _result:*;
[Bindable]
var _result2:*;
protected function
dropDownList_creationCompleteHandler(event:FlexEvent):void
{
var xml:XML = <Body>
<myusersResponse xmlns="http://Services.com">
<myusersReturn>
<name>Nicole</name>
<age>50</age>
</myusersReturn>
<myusersReturn>
<name>Jayne</name>
<age>40</age>
</myusersReturn>
<myusersReturn>
<name>Alex</name>
<age>33</age>
</myusersReturn>
</myusersResponse>
</Body>;
var xmlString:String = xml.toXMLString();
var patt:RegExp = new RegExp("xmlns[^\"]*\"[^\"]*\"", "gi");
var newXmlString:String = xmlString.replace(patt, "");
xml = new XML(newXmlString);
_result = new XMLListCollection(xml.myusersResponse.myusersReturn);
}
protected function dropDownList2_creationCompleteHandler(event:FlexEvent):void
{
var xml:XML = <Body>
<myusersResponse xmlns="http://Services.com">
<myusersReturn>
<name>Nicole</name>
<age>50</age>
</myusersReturn>
<myusersReturn>
<name>Jayne</name>
<age>40</age>
</myusersReturn>
<myusersReturn>
<name>Alex</name>
<age>33</age>
</myusersReturn>
</myusersResponse>
</Body>;
var ns:Namespace = new Namespace("http://Services.com");
_result2 = new XMLListCollection(xml.ns::myusersResponse.ns::myusersReturn);
}
private function dropDownList2_labelFunction(item:Object):String{
var itemXml:XML = item as XML;
var ns:Namespace = new Namespace("http://Services.com");
return item.ns::name;
}
]]>
</fx:Script>
<fx:Declarations>
</fx:Declarations>
<s:FormItem label="Label">
<s:DropDownList id="dropDownList"
creationComplete="dropDownList_creationCompleteHandler(event)"
labelField="name">
<s:AsyncListView list="{_result}"/>
</s:DropDownList>
<s:DropDownList id="dropDownList2"
creationComplete="dropDownList2_creationCompleteHandler(event)"
labelFunction="dropDownList2_labelFunction">
<s:AsyncListView list="{_result2}"/>
</s:DropDownList>
</s:FormItem>
这篇关于我的 flex 代码没有正确解析肥皂响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!