2012-04-04 5 views
1

Webサービスからデータを取得しようとするWindows Phone 7.1アプリケーションがあります。データはXML形式です。言語は、Visual Studio 2010の下でAsync CTP 3を使用するvb.netです。子孫ループ内の空のXElement

Webサービスからの応答を正常に取得し、その文字列をXDocumentに解析しました。

<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> 
:Webサービスからの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 

例:XMLをループでのviewmodelを移入しようとする。しかし、私は問題を抱えているので、ループ変数は、(私はそれがXElementオブジェクトを含むようにしたい)何も含まれていません

新しいムービーを作成する行にブレークポイントを設定しました。変数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は何も含まれていないのはなぜ? resultdoc.Descendants("movie")から適切なXElementが含まれるようにするにはどうすればよいですか?例外]ダイアログボックスの[コメントからダウンコピーさ]

+0

XMLにはXML名前空間、チャンスごとに? – svick

+0

@svick XMLに名前空間がありません。 –

+0

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

答えて

0

ゴー(デバッグメニューの下でなければなりません)ととNullReferenceExceptionがスローされたときに壊れるように選択します。エラーがどこにあるかが正確にわかります。何が起こっているのかは、サーバーから戻ってくるXMLノードの1つに、タイトルやキャスト、または他の属性の属性が1つもなく、その上で死んでいるということです。