Reputation: 131
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()
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>
My Flex code
<?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>
Upvotes: 1
Views: 657
Reputation: 936
Use xml parsing with namespace definition:
protected function dropDownList_creationCompleteHandler(event:ResultEvent):void
{
namespace ns = "http://Services.com";
use namespace ns;
namespace ns_soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
use namespace ns_soapenv;
var xml:XML = event.result as XML;
_result = xml.Body.mycustomersResponse.mycustomersReturn;
}
Upvotes: 0
Reputation: 1437
coming from here dropdown list does not show its values I slightly modified my example. There are two opportunities:
Strip namespace from xml
Utilize namespace
Those are shown in dropDownList and dropDownList2 code respectively.
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>
Upvotes: 1
Reputation: 8392
I think you should use event.result..mycustomersReturn
. That will return an XMLList
with two items that you can then convert and use in your dropdown.
Upvotes: 1