1

我的代码应该解析 SOAP 响应并填充下拉列表。当我手动添加 xml 代码时,它可以工作,但是当我尝试解析 SOAP 响应时,它会遇到以下错误:

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 响应

  <?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>

我的弹性代码

<?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>
4

3 回答 3

1

我认为你应该使用event.result..mycustomersReturn. 这将返回一个XMLList带有两个项目,然后您可以在下拉列表中转换和使用它们。

于 2013-01-14T07:48:46.813 回答
1

来自这里的下拉列表没有显示它的值我稍微修改了我的例子。有两个机会:

  1. 从 xml 中剥离命名空间

  2. 利用命名空间

这些分别显示在 dropDownList 和 dropDownList2 代码中。

请注意,您不能使用仍然使用 labelField 属性的命名空间(至少我找不到方法)。您必须使用 labelFunction 来提取标签。

<?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>

于 2013-01-15T12:02:26.817 回答
0

使用带有命名空间定义的 xml 解析:

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;
            }
于 2013-01-16T14:35:20.793 回答