2012-04-04 8 views
1

웹 서비스에서 데이터를 가져 오는 Windows Phone 7.1 앱이 있습니다. 데이터는 XML 형식입니다. Visual Studio 2010에서 비동기 CTP 3을 사용하는 언어가 vb.net입니다.자손 루프의 빈 XElement

웹 서비스에서 응답을 성공적으로 가져 와서 해당 문자열을 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> 
: 웹 서비스에서 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 통해 반복하여 뷰 모델을 채울하려고 할 때하지만 문제가 있기 때문에 루프 변수는 (나는 그것이하여 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이 throw 될 때 중단되도록 선택하십시오. 오류가 어디에 있는지 정확히 알 수 있습니다. 서버에서 돌아 오는 XML 노드 중 하나에 제목이나 캐스트 또는 다른 속성 중 하나가 없으므로 그 노드에서 죽어 가고 있습니다. –

답변

0

예외 대화 상자

이동 (디버그 메뉴 아래에 있어야한다) 및 NullReferenceException이가 발생하면 중단을 선택합니다. 오류가 어디에 있는지 정확히 알 수 있습니다. 무슨 일이 일어날 수 있습니다 서버에서 돌아 오는 XML 노드 중 하나는 제목이나 캐스트 또는 다른 속성 중 하나가없고 그로 인해 죽어 가고 있다는 것입니다.