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により、ドロップダウンで変換して使用できる 2 つのアイテムが返されます。

于 2013-01-14T07:48:46.813 に答える
1

ここからドロップダウン リストに値が表示されない例を少し変更しました。次の 2 つの機会があります。

  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 に答える