我的 flex 代码没有正确解析肥皂响应 [英] My flex code does not parse the soap response properly

查看:17
本文介绍了我的 flex 代码没有正确解析肥皂响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码应该解析 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:

  1. 从 xml 中剥离命名空间

  1. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆