Пустой 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, который вы получаете от сервера, нет заголовка или приведения или другого атрибута, и вы умираете от этого