2012-04-16 19 views
0

我想显示电影的日期比今天要屏幕。我一整天都在阅读不同的主题,购买我无法让webRequest工作。HttpWebRequest的XML解析不显示任何东西

基本上我有webClient的工作代码,但我希望UI是响应,所以我决定使用httpWebRequest保持xml解析关闭UI线程。

public partial class MainPage : PhoneApplicationPage { 



public MainPage() { 
    InitializeComponent(); 
} 

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { 
    DoHttpWebRequest(); 
} 


private void DoHttpWebRequest() { 
    string url = "http://www.cinamon.ee/rss/schedule/1001.xml"; 
    var request = HttpWebRequest.Create(url); 
    var result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request); 
} 

private void ResponseCallback(IAsyncResult result) { 
    var request = (HttpWebRequest)result.AsyncState; 
    var response = request.EndGetResponse(result); 

    using (var stream = response.GetResponseStream()) { 

    XDocument scheduleXml = XDocument.Load(stream); 
    var todayMovies = from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show") 
         where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) && 
         DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) > 0 
         select new Movie() { 
         MoviePicture = new BitmapImage(new Uri((string)query.Element("images").Element("imageType2").Value, UriKind.RelativeOrAbsolute)), 
         MovieName = (string)query.Element("title"), 
         MovieId = (string)query.Element("movieId"), 
         MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm") 
         }; 

    // Removing duplicate movies from list. 
    List<Movie> todayList = todayMovies.ToList(); 
    IEnumerable<Movie> noDuplicates3 = todayList.Distinct(new MovieComparer()); 

    // Adding to the UI 
    Dispatcher.BeginInvoke(() => { 
     todayBox.ItemsSource = noDuplicates.ToList(); 
    }); 
    } 

} 
} 

有没有人有看到这段代码有什么错误的想法?

谢谢你提前 编辑。这是我基于我的解决方案的链接 - http://social.msdn.microsoft.com/Forums/en-US/windowsphone7series/thread/594e1422-3b69-4cd2-a09b-fb500d5eb1d8

EDIT2。我的Mainpage.xaml

<StackPanel x:Name="TodayPanel" Grid.Row="1" Margin="10,5,10,10" Orientation="Horizontal" Height="580" Background="#90000000" > 
     <ListBox x:Name="todayBox"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
      <HyperlinkButton x:Name="hyperLinkButton" Style="{StaticResource HyperlinkButtonStyle1}" CommandParameter="{Binding MovieId}" Tap="hyperLinkButton_Tap"> 
       <HyperlinkButton.Content> 
       <StackPanel Margin="10" Grid.Row="1" Orientation="Horizontal"> 
        <Image Source="{Binding MoviePicture}" /> 
        <StackPanel Margin="10" Grid.Row="1" Orientation="Vertical"> 
        <TextBlock TextWrapping="Wrap" Margin="10, 5, 10, 5" Width="200" FontFamily="Trebuchet MS" Foreground="Orange" VerticalAlignment="Top"> 
             <Run Text="{Binding MovieName}"/> 
             <LineBreak></LineBreak> 
        </TextBlock> 
        <TextBlock TextWrapping="Wrap" Width="200" FontFamily="Trebuchet MS" Foreground="White" VerticalAlignment="Bottom"> 
             <Run Text="Järgmine seanss: "/> 
             <LineBreak></LineBreak> 
             <Run Text="{Binding MovieSoonest}"/> 
        </TextBlock> 
        </StackPanel> 
       </StackPanel> 
       </HyperlinkButton.Content> 
      </HyperlinkButton> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
     </ListBox> 
    </StackPanel> 

和我编辑后的代码。

private void DoHttpWebRequest() { 
    string url = "http://www.cinamon.ee/rss/schedule/1001.xml"; 
    var request = HttpWebRequest.Create(url); 
    var result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request); 
} 

private void ResponseCallback(IAsyncResult result) { 
    var request = (HttpWebRequest)result.AsyncState; 
    var response = request.EndGetResponse(result); 

    // Adding to the UI 
    Dispatcher.BeginInvoke(() => { 
    IEnumerable<Movie> todayMovies; 
    using (var stream = response.GetResponseStream()) { 

     XDocument scheduleXml = XDocument.Load(stream); 
     todayMovies = from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show") 
        where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) && 
        DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) > 0 
        select new Movie() { 
         MoviePicture = new BitmapImage(new Uri((string)query.Element("images").Element("imageType2").Value, UriKind.RelativeOrAbsolute)), 
         MovieName = (string)query.Element("title"), 
         MovieId = (string)query.Element("movieId"), 
         MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm") 
        }; 
    } 

     var todayList = todayMovies.ToList(); 
     //IEnumerable<Movie> noDuplicates = movieList.Distinct(new MovieComparer()); 

     todayBox.ItemsSource = todayList.ToList(); 



    }); 

回答

1

我试过你的代码,并得到UnauthorizedAccessException。通过改变Dispactcher.Begininvoke委托的范围内它的工作原理如下:

private void ResponseCallback(IAsyncResult result){ 
var request = (HttpWebRequest) result.AsyncState; 
var response = request.EndGetResponse(result); 
// Adding to the UI 
Dispatcher.BeginInvoke(() => 
{ 
IEnumerable<Movie> todayMovies; 
using (var stream = response.GetResponseStream()) 
{ 

    XDocument scheduleXml = XDocument.Load(stream); 
    todayMovies = 
     from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show") 
     where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) && 
       DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) > 
       0 
     select new Movie() 
        { 
         MoviePicture = 
          new BitmapImage(
          new Uri((string) query.Element("images").Element("imageType2").Value, 
            UriKind.RelativeOrAbsolute)), 
         MovieName = (string) query.Element("title"), 
         MovieId = (string) query.Element("movieId"), 
         MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm") 
        }; 

} 
// Removing duplicate movies from list. 
var todayList = todayMovies.ToList(); 
    //IEnumerable<Movie> noDuplicates3 = todayList.Distinct(new MovieComparer()); 


            todayBox.ItemsSource = todayList.ToList(); 
           }); 

}

但是你可以使用RestSharp库(你会发现它的NuGet),以使其更容易。请检查下面的代码:

public void RestSample(){ 
var client = new RestClient 
{ 
    BaseUrl = "http://www.cinamon.ee/" 
}; 

var request = new RestRequest 
{ 
    Resource = "rss/schedule/1001.xml" 
}; 

client.ExecuteAsync(request, (a) => 
{ 
    if (a.StatusCode == HttpStatusCode.OK) 
    { 
     var scheduleXml = XDocument.Parse(a.Content); 

     var todayMovies = from query in scheduleXml.Descendants("schedule").Descendants("shows").Descendants("show") 
          where DateTime.Parse(query.Element("showDateTime").Value).Date.Equals(DateTime.Now.Date) && 
          DateTime.Parse(query.Element("showDateTime").Value).TimeOfDay.CompareTo(DateTime.Now.TimeOfDay) > 0 
          select new Movie() 
          { 
           MoviePicture = new BitmapImage(new Uri((string)query.Element("images").Element("imageType2").Value, UriKind.RelativeOrAbsolute)), 
           MovieName = (string)query.Element("title"), 
           MovieId = (string)query.Element("movieId"), 
           MovieSoonest = DateTime.Parse(query.Element("showDateTime").Value).ToString("H:mm") 
          }; 

     // Removing duplicate movies from list. 
     List<Movie> todayList = todayMovies.ToList(); 
     //IEnumerable<Movie> noDuplicates = todayList.Distinct(new MovieComparer()); 

     // Adding to the UI 
     Dispatcher.BeginInvoke(() => 
     { 
      todayBox.ItemsSource = todayList.ToList(); 
     }); 
    } 
    else 
    { 
     //error 
    } 
}); 

}

试试吧,让我们知道...

编辑:xaml.cs的DataTemplate:

 <StackPanel x:Name="TodayPanel" Grid.Row="1" Margin="10,5,0,10" Orientation="Horizontal" Height="580" Background="#90000000" > 
     <ListBox x:Name="todayBox" Width="468"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Margin="10" Orientation="Horizontal"> 
           <Image Source="{Binding MoviePicture, FallbackValue=http://www.cinamon.ee/visinternetticketing/images/movies/NowShowingComingSoon/HungerGames.jpg}" /> 
           <StackPanel Margin="10" Grid.Row="1" Orientation="Vertical"> 
            <TextBlock TextWrapping="Wrap" Margin="10, 5, 10, 5" FontFamily="Trebuchet MS" Foreground="Orange" VerticalAlignment="Top" Text="{Binding MovieName}"/> 
            <TextBlock TextWrapping="Wrap" FontFamily="Trebuchet MS" Foreground="White" VerticalAlignment="Bottom" Text="{Binding MovieSoonest}"/> 
           </StackPanel> 
           <HyperlinkButton x:Name="hyperLinkButton" CommandParameter="{Binding MovieId}" /> 
          </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </StackPanel> 

RECALL 变化MovePicture从物业BitmapImage字符串

That's my result using DataTemplate above

+0

我想你第一次发布的解决方案,但它仍然不会工作。没有错误,没有任何东西。该页面只是空的。 还没有尝试过RestSharp,因为恐怕我无法实现“加载栏”,因为该库可用的教程数量较少。我以后会尝试,也许这会起作用 – JoonasL 2012-04-16 14:46:40

+0

当你什么都不说,今天什么都没有出现在?你是否创建了它的DataTemplate?我试了一下,它适用于我。请让我知道.. – 2012-04-16 15:21:06

+0

我编辑我的原始帖子与我的mainpage.xaml和.cs。 dataTemplate必须正确,因为当我再次使用webClient – JoonasL 2012-04-16 15:48:30