30 приложений для Windows Phone: Поиск по OZON.RU

Покопавшись на сайте магазина OZON.RU я нашел XML-интерфейс для работы с поиском по сайту. Находится он здесь: www.ozon.ru/webservice/webservice.asmx/SearchWebService?searchText=test&searchContext=

В GET параметре searchText содержится поисковый запрос.

Итак, приступим. Создадим новый проект Windows Phone Application. Назовем проект OZONSearch. В итоге получаем дефолтную страницу с разметкой. Разместим на странице текстовое поле TextBox, кнопку Button и список ListBox.

...
<!--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="OZON.RU" Style="{StaticResource PhoneTextNormalStyle}"/>
    <TextBlock x:Name="PageTitle" Text="поиск" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    <Grid>
    <TextBox Height="72" Margin="6,16,174,29" Name="textBox1" Text="" Width="288" />
    <Button Content="Искать" Height="72" Name="button1" Width="160" Margin="288,17,8,28" Click="button1_Click" />
    </Grid>
</StackPanel>

<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <ListBox x:Name="Results" Height="Auto" HorizontalAlignment="Left" Margin="4,3,0,0"
       VerticalAlignment="Top" Width="423" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Height="100" Margin="0,10,0,0">
                    <Image Source="{Binding PictureURL}" Width="80" Height="100" Stretch="Fill"
                      DataContext="{Binding}" HorizontalAlignment="Left" VerticalAlignment="Center" 
					  Margin="0,0,10,0" />
                    <StackPanel Orientation="Vertical" Height="100" VerticalAlignment="Top">
                        <StackPanel Orientation="Horizontal" Height="Auto" VerticalAlignment="Top">
                            <TextBlock Width="320" FontSize="18" Text="{Binding Name}"
                                TextWrapping="Wrap" VerticalAlignment="Top" />
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" Height="60">
                            <TextBlock Width="320" FontSize="32" Text="{Binding PriceFormatted}" />
                        </StackPanel>
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

Итак, в итоге мы имеем нечто такое:

Разметка

Разметку мы получили, теперь необходимо прикрепить к ней данные. Для начала мы напишем класс OzonItem, который будет представлять из себя контейнер данных об одном результате поиска.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace OZONSearch
{
  public class OzonItem
  {
    public int ID { get; set; }
    public string Name { get; set; }
    public string PictureURL { get; set; }
    public int isAvailable { get; set; }
    public string Price { get; set; }
    public string PriceFormatted { get; set; }
 
    public OzonItem(int ID, string Name, string PictureURL, int isAvailable, string Price)
    {
      this.ID = ID;
      this.Name = Name;
      this.PictureURL = PictureURL;
      this.isAvailable = isAvailable;
      this.Price = Price;
      this.PriceFormatted = double.Parse(Price).ToString() + " руб.";
    }
 
    public override string ToString()
    {
      string info = "";
      info += this.GetType().ToString()+"\n";
      info += "ID: "+ this.ID + "\n";
      info += "Name: " + this.Name + "\n";
      info += "PictureURL: " + this.PictureURL + "\n";
      info += "isAvailable: " + this.isAvailable + "\n";
      info += "Price: " + this.Price + "\n";
 
      return info;
    }
  }
}

Как видно из кода мы будем хранить ID, Picture, Name, Availability и Price. Также сразу добавим поле для хранения форматированной цены.

Логика приложения. Вводим в текстовое поле поисковый запрос. Затем щелкаем кнопку «Искать» и получаем результаты от Ozon.ru.

Собственно, вот код класса страницы. (Предварительно добавьте ссылку на пространство имен System.Xml.Linq для доступа к класс XDocument).

private void button1_Click(object sender, RoutedEventArgs e)
{
    WebClient data = new WebClient();
    data.DownloadStringCompleted += new DownloadStringCompletedEventHandler(OnDownloadItemsCompleted);
    data.DownloadStringAsync
	    (new Uri("http://www.ozon.ru/webservice/webservice.asmx/SearchWebService?searchText=" + textBox1.Text + "&searchContext="));
}

 private void OnDownloadItemsCompleted(object sender, DownloadStringCompletedEventArgs e)
 {
     if (e.Error != null)
     {
         // throws NotFound
         throw e.Error;
     }

     XDocument xml = XDocument.Parse(e.Result);

     // results from search
     List<OzonItem> results = new List<OzonItem>();

     IEnumerable<XElement> list = xml.Descendants("SearchItems");

     if (list != null)
     {
         foreach (XElement node in list)
         {
             results.Add(new OzonItem(
                         int.Parse(node.Element("ID").Value),
                         node.Element("Name").Value,
                         node.Element("Picture").Value.Replace("/small", "").Replace(".gif", ".jpg"),
                         int.Parse(node.Element("ItemAvailabilityID").Value),
                         node.Element("Price").Value
                       ));
         }
     }

     this.Results.ItemsSource = results;
 }

Можно отметить процесс загрузки XML. Кто использовал уже в своих приложениях Silverlight, тот знает, что все запросы в любым сервисам необходимо делать асинхронно в фоне, что мы здесь и делаем. Метод button1_Click является обработчиком нажатия кнопки «Искать». По нажатию XML начинает скачиваться, а по окончанию выполняется функция OnDownloadItemsCompleted (это видно из передаваемого делегета в data.DownloadStringCompleted). После скачки я думал воспользоваться классом XMLDocument, но его не оказалось в простарнстве System.Xml. Поэтому я решил воспользоваться классом XDocument. Что же мы делаем дальше? Мы обрабатываем полученную строку от Ozon.ru, делаем выборку по тегу «SearchItems», затем пробегаемся по массиву этих элементов, попутно записывая их в коллекцию List. В итоге имеем все результаты в типизированной коллекции, которую присоединяем к ListBox'у как источник данных.

Вот скриншот с примером работы приложения:

Свеча

Источник: Опыт первого приложения для Windows Phone 7 Series с использованием Silverlight. Автор: Кулицкий Александр

Реклама