连接到WP7应用程序的Web地址的XML文件

时间:2010-11-09 21:13:37

标签: xml silverlight windows-phone-7 webclient windows-phone

过去几周,我一直在努力学习Windows Phone 7编程的细节。我已经学习了大部分基础知识但是我一直在找一本教程解释如何用XML做些什么。我想创建一个非常基本的应用程序,它可以访问Web地址的XML文件,并在应用程序中将文件中的各个项目显示为文本。我遇到过几个教程,它们似乎都以不同的方式进行,或者没有完全解释我想要做的事情。我不想搜索XML文件,我不想更新它,我只想检索它的内容。在XML文件中是“项目”,其中包括“标题”和“描述”之类的类别。我希望应用程序列出所有项目,并在每个项目中显示它的标题和描述。

更具体地说,我知道我使用{Binding Title}或{Binding Description}将内容绑定到文本块。我只是不确定如何使用WebClient或任何最简单的方法连接到该文件。显示已在我的解决方案资源管理器中的脱机XML文件的内容没有问题。

我确信有一种非常简单的方法可以做到这一点,我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

ScottGu created an app展示了您的需求。 (下面的代码与他的例子中找不到源代码的链接非常相​​似。)

该应用程序从Web服务(在本例中是从Twitter)中检索XML。

    private void GetTweets()
    {
        WebClient twtr = new WebClient();

        twtr.DownloadStringCompleted += new DownloadStringCompletedEventHandler(twitter_DownloadStringCompleted);
        twtr.DownloadStringAsync(new Uri("http://search.twitter.com/search.atom?&q=searchterm"));
    }

然后将XML解析为对象集合。

    void twitter_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
            return;

        XElement xmlTweets = XElement.Parse(e.Result);

        var list = new List<TweetViewModel>();

        foreach (XElement t in xmlTweets.Elements("{http://www.w3.org/2005/Atom}entry"))
        {
            var userName = t.Element("{http://www.w3.org/2005/Atom}author").Element("{http://www.w3.org/2005/Atom}name").Value.Split(' ')[0];
            var message = t.Element("{http://www.w3.org/2005/Atom}title").Value;
            var imageSource = (from t2 in t.Elements("{http://www.w3.org/2005/Atom}link")
                               where t2.Attribute("type").Value.Contains("image")
                               select t2.Attribute("href").Value).First();

            list.Add(new TweetViewModel
                    {
                        UserName = userName,
                        Message = message,
                        ImageSource = imageSource
                    });
        }

        twitterList.ItemsSource = list;
    }


public class TweetViewModel
{
    public string UserName { get; set; }
    public string Message { get; set; }
    public string ImageSource { get; set; }
}

然后将其绑定到列表。

<ListBox HorizontalAlignment="Left" Name="twitterList" VerticalAlignment="Top" Width="476">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Height="132">
                <Image Source="{Binding ImageSource}" Height="73" Width="73" VerticalAlignment="Top" Margin="0,10,8,0"/>
                <StackPanel Width="370">
                    <TextBlock Text="{Binding UserName}" Foreground="#FFC8AB14" FontSize="28" />
                    <TextBlock Text="{Binding Message}" TextWrapping="Wrap" FontSize="24" />
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

它是用工具/ SDK的第一个CTP编写的,但希望它仍然应该足够简单以使其正常工作。

答案 1 :(得分:0)

更新:

我认为当我调用GetRoster时问题可能是对的。这是我称之为的上下文:

namespace TwitterMix
{
public partial class MainPage : PhoneApplicationPage
{
    // Constructor
    public MainPage()
    {
        InitializeComponent();
    }


    private void GetRoster()
    {
        WebClient rstr = new WebClient();

        rstr.DownloadStringCompleted += new DownloadStringCompletedEventHandler(roster_DownloadStringCompleted);
        rstr.DownloadStringAsync(new Uri("http://www.danfess.com/data.xml"));
    }

调用它的正确位置是什么?顺便说一句,我很抱歉代码部分没有正确显示。


嘿伙计们!谢谢您的帮助!我没有提前创建一个帐户,所以这可能会显示为一个答案,因为我在另一台计算机上。我尽力将Twitter教程改为我想要做的事情。我没有收到任何错误,但它没有在模拟器中显示任何内容。我创建了一个XML文件并将其上传到我的个人网站。不幸的是,我无法让代码示例按钮工作得很好。所以我很抱歉这看起来很糟糕。 XML文件包含以下信息:

<?xml version="1.0" encoding="utf-8" ?>
<roster>
  <person><name>Blake</name><age>25</age></person>
  <person><name>Jane</name><age>29</age></person>
  <person><name>Bryce</name><age>29</age></person>
  <person><name>Colin</name><age>29</age></person>
</roster>

这是MainPage.xaml.cs:

private void GetRoster()
    {
        WebClient rstr = new WebClient();

        rstr.DownloadStringCompleted += new DownloadStringCompletedEventHandler(roster_DownloadStringCompleted);
        rstr.DownloadStringAsync(new Uri("http://www.MyPersonalWebsiteURL.com/data.xml"));
    }

    void roster_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
            return;

        XElement xmlPersons = XElement.Parse(e.Result);

        var list = new List<RosterViewModel>();

        foreach (XElement person in xmlPersons.Elements("person"))
        {
            var name = person.Element("name").Value;
            var age = person.Element("age").Value;


            list.Add(new RosterViewModel
            {
                Name = name,
                Age = age,
             });
        }

        rosterList.ItemsSource = list;
    }


    public class RosterViewModel
    {
        public string Name { get; set; }
        public string Age { get; set; }
    }
}

现在MainPage.xaml:

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <ListBox HorizontalAlignment="Left" Name="rosterList" ItemsSource="rosterList" VerticalAlignment="Top" Width="476">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Height="132">

                        <StackPanel Width="370">
                            <TextBlock Text="{Binding Name}" Foreground="#FFC8AB14" FontSize="28" />
                            <TextBlock Text="{Binding Age}" TextWrapping="Wrap" FontSize="24" />
                        </StackPanel>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Grid>

然而!当我在模拟器中运行应用程序时,我没有收到任何错误,但没有任何内容显示。我知道解决方案可能非常简单,所以我想重申一下你的帮助对我意味着什么。非常感谢您提供的任何建议。