2012-04-04 7 views
1

Ich habe eine Windows Phone 7.1 App, die versucht, Daten von einem Webdienst zu erhalten. Die Daten sind im XML-Format. Sprache ist vb.net unter Visual Studio 2010 mit dem Async CTP 3.Empty XElement in Descendants Schleife

Ich habe erfolgreich die Antwort vom Webdienst abgerufen und die Zeichenfolge in ein XDocument analysiert. Aber ich habe ein Problem, wenn sie durch Looping durch die XML ein Ansichtsmodell zu füllen versuchen, weil die Schleifenvariable enthält nichts (ich will es XElement enthalten):

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 

Beispiel für XML-Daten aus dem Web-Service:

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

Ich habe einen Haltepunkt in der Zeile, die neue Filme erstellt. Ich kann bestätigen, dass die Variable resultdoc ausgefüllt ist. Ich versuchte im unmittelbaren Fenster resultdoc.Descendants("movie").Count zurückgegeben 15. resultdoc.Descendants("movie").First.Attribute("code").Value korrekt zurückgegeben "MOV1299".

habe ich diesen Fehler, wenn ich aus dem Haltepunkt fortgesetzt:

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) 

Warum die Variable movie nichts enthält? Wie kann ich sicherstellen, dass es das richtige XElement von resultdoc.Descendants("movie") enthält?

+0

Hat der XML einen XML-Namespace, pro Chance? – svick

+0

@svick das XML hat keinen Namensraum. –

+0

Wechseln Sie zum Dialogfeld "Ausnahmen" (sollte sich im Debug-Menü befinden), und wählen Sie, dass das Programm bricht, wenn NullReferenceException ausgelöst wird. Sie werden genau sehen, wo der Fehler ist. Was passiert, ist, dass einer der XML-Knoten, den Sie vom Server zurückbekommen, keinen Titel oder Cast oder eines der anderen Attribute auf ihnen hat und Sie daran sterben. –

Antwort

0

[aus dem Kommentar Kopierte down]

Gehen Sie auf das Dialogfeld Ausnahmen (sollte unter dem Debug-Menü sein), und wählen Sie zu brechen, wenn Nullreferenceexception geworfen wird. Sie werden genau sehen, wo der Fehler ist. Was passieren kann, ist, dass einer der XML-Knoten, die Sie vom Server zurückerhalten, keinen Titel oder Cast oder eines der anderen Attribute auf ihnen hat und dass Sie dabei sterben.