Пустой XElement в цикле Потомки

У меня есть приложение для Windows Phone 7.1, которое пытается получить данные из веб-службы. Данные в формате XML. Язык vb.net под Visual Studio 2010 с Async CTP 3.

Я успешно получил ответ от веб-службы и проанализировал строку в XDocument. Но у меня возникла проблема при попытке заполнения модели представления путем циклического перебора XML, поскольку переменная цикла ничего не содержит (я хочу, чтобы она содержала XElement):

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 из веб-сервиса:

<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")?

1 ответ

Решение

[Скопировано из комментария]

Перейдите в диалоговое окно "Исключения" (должно быть в меню отладки) и выберите разрыв, когда выбрасывается исключение NullReference Exception. Вы увидите, где именно ошибка. Может случиться так, что на одном из узлов XML, который вы получаете от сервера, нет заголовка или приведения или другого атрибута, и вы умираете от этого

Другие вопросы по тегам