HttpWebRequest xml解析不显示任何内容

时间:2012-04-16 12:39:55

标签: windows-phone-7 httpwebrequest

我正在尝试显示电影的电影日期,而不是今天要播放的电影。我一整天都在读不同的帖子,买不到webRequest工作。

基本上我使用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。我的主页.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 个答案:

答案 0 :(得分: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 将BitmapImage的MovePicture属性更改为字符串

That's my result using DataTemplate above