1

Webサービスからデータを取得しようとするWindowsPhone7.1アプリがあります。データはXML形式です。言語は、AsyncCTP3を使用するVisualStudio2010ではvb.netです。

Webサービスから応答を正常に取得し、文字列を解析してXDocumentにしました。しかし、ループ変数には何も含まれていないため(XElementを含めたい)、XMLをループしてビューモデルにデータを入力しようとすると問題が発生します。

Private Async Function GetMovies() As Task
    Dim client As New WebClient
    Dim address = (New Uri(New Uri(APIROOT), "movieschedule/movies")).ToString

    Dim resulttxt = Await client.DownloadStringTaskAsync(address)

    Dim resultdoc = XDocument.Parse(resulttxt)
    Dim resultlist As New Collections.ObjectModel.ObservableCollection(Of Movies)
    For Each movie In resultdoc.Descendants("movie")

        ' **the variable 'movie' contains nothing**

        Dim m As New Movies With {
            .Cast = movie.Attribute("cast").Value,
            ...
            .Title = movie.Attribute("title").Value
        }
        resultlist.Add(m)
    Next

    Movies = resultlist
End Function

WebサービスからのXMLの例:

<movies>
  <movie code="MOV1299" title="Age of Heroes" is3D="0" genre="THRILLER" rating="D" cast="Sean Bean, Danny Dyer, Izabella Miko, James D'Arcy, Sebastian Street, William Houston" director="Adrian Vitoria" language="ENGLISH" subtitle="BAHASA INDONESIA" />
  <movie code="MOV1325" title="Fast and Furious 5" is3D="0" genre="ACTION" rating="D" cast="Vin Diesel, Paul Walker, Dwayne Johnson, Jordana Brewster, Tyrese Gibson, Elsa Pataky" director="Justin Lin" language="ENGLISH" subtitle="BAHASA INDONESIA" />
</movies>

新しいムービーを作成する行にブレークポイントを設定しました。変数resultdocが設定されていることを確認できます。resultdoc.Descendants("movie").Countすぐに15を返したウィンドウで試してみました。resultdoc.Descendants("movie").First.Attribute("code").Value正しく「MOV1299」を返しました。

ブレークポイントから続行すると、次のエラーが発生しました。

System.NullReferenceException was unhandled
  Message=NullReferenceException
  StackTrace:
       at MyApp.MainPageVM.VB$StateMachine_2_GetMovies.MoveNext()
       at System.Runtime.CompilerServices.TaskAwaiter.<>c__DisplayClass5.<OnCompletedInternal>b__1(Object state)
       at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
       at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
       at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
       at System.Delegate.DynamicInvokeOne(Object[] args)
       at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)
       at System.Delegate.DynamicInvoke(Object[] args)
       at System.Windows.Threading.DispatcherOperation.Invoke()
       at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)
       at System.Windows.Threading.Dispatcher.OnInvoke(Object context)
       at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)
       at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)
       at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult)

変数movieに何も含まれていないのはなぜですか?から適切なXElementを含めるにはどうすればよいresultdoc.Descendants("movie")ですか?

4

1 に答える 1

0

[コメントからコピー]

[例外]ダイアログボックス(デバッグメニューの下にあるはずです)に移動し、NullReferenceExceptionがスローされたときに中断することを選択します。エラーがどこにあるかが正確にわかります。何が起こっているのかというと、サーバーから返されるXMLノードの1つにタイトル、キャスト、またはその他の属性の1つがなく、その上で死にかけているということです。

于 2012-04-07T16:20:37.697 に答える