Подключение к XML-файлу по веб-адресу для приложения WP7 - PullRequest
0 голосов
/ 10 ноября 2010

За последние несколько недель я пытался изучить все тонкости программирования Windows Phone 7.Я изучил большинство основ, но у меня были проблемы с поиском учебника, объясняющего, как именно что-то делать с XML.Я хочу создать очень простое приложение, которое обращается к XML-файлу по веб-адресу и отображает различные элементы в файле в виде текста в приложении.Я сталкивался с несколькими уроками, которые, кажется, все делают это по-другому, или не объясняют, что именно я хочу сделать.Я не хочу искать файл XML, я не хочу его обновлять, я просто хочу получить его содержимое.Внутри XML-файла находятся «элементы», а внутри такие категории, как «заголовок» и «описание».Я хочу, чтобы приложение перечисляло все элементы, и на каждом из них отображались заголовок и описание.

Точнее, я знаю, что привязываю содержимое к текстовым блокам, используя {Binding Title} или {Binding Description}.Я просто не уверен, как подключиться к файлу с помощью WebClient или каков самый простой способ.У меня нет проблем с отображением содержимого автономного XML-файла, который уже находится в моем обозревателе решений.

Я уверен, что есть очень простой способ сделать это, и я действительно ценю всю вашу помощь.

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

ScottGu создал приложение , которое демонстрирует, что вам нужно.(Код ниже очень похож, так как не смог найти ссылку на источник из его примера.)

Приложение извлекает XML из веб-службы (в данном случае из Twitter.)

    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>

Он был записан с первым CTP инструментария / SDK, нонадеюсь, все еще должно быть достаточно просто, чтобы заставить это работать.

0 голосов
/ 10 ноября 2010

ОБНОВЛЕНИЕ:

Я думаю, вы были правы, что проблема может быть, когда я звоню в 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"));
    }

'

Каково было бы правильное место, где его можно назвать?Кстати, мне жаль, что разделы кода не отображаются правильно.


Эй, ребята!Спасибо за помощь!Я не создавал учетную запись ранее, так что это, вероятно, будет отображаться как ответ, так как я на другом компьютере.Я приложил все усилия, чтобы превратить этот урок в Твиттер в то, что я пытаюсь сделать.Я не получаю ошибок, но в эмуляторе не отображается никакой контент.Я создал файл 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>

'

Однако!Когда я запускаю приложение в эмуляторе, я не получаю никаких ошибок, но контент вообще не отображается.Я знаю, что решение, вероятно, очень простое, поэтому я хотел бы повторить, что ваша помощь значит для меня.Большое спасибо за любой совет, который вы можете дать.

...