気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
前回の記事で、位置情報の取得部分を紹介したので、今回は、楽天のWebAPIから周辺の施設情報を取得する部分を紹介します。

■Windows PhoneのWeb接続

Windows PhoneからのWeb接続は、「WebClient」を使用する方法が最もシンプルです。
検索ボタンのイベントハンドラで以下のように、記述しています。

[MailPage.xaml.cs]
   WebClient webClient = new WebClient();
   //ダウンロードが完了した時点で発生するイベント
   webClient.DownloadStringCompleted +=
       new DownloadStringCompletedEventHandler((Object downloadEventSender, DownloadStringCompletedEventArgs downloadEventArgs) =>
       {
           //結果のXMLを解析するメソッド
           SetHotelList(downloadEventArgs.Result);
       });
   //ダウンロードを非同期で開始する
   webClient.DownloadStringAsync(new Uri(requestUrl));

「Silverlight」のWebClientには同期型のダウンロードメソッドが提供されていないので、
Web接続は、必ず非同期で実施することになります。

個人的には、バックグラウンドスレッドを使えば、同期メソッドでも、非同期で使用できるので、メソッド自体は提供されても良いのでは思います。
非同期処理の場合、処理が入れ子になって、ソースが見づらくなる傾向があります。
別の方法として、Silverlightに標準装備されている「Reactive Extensions」を使用すると、シンプルに処理を記述することが可能になります。
これについては、別に記事にしたいと思っています。

ダウンロードの結果は、DownloadStringCompletedEventArgsのResultプロパティから取得することが可能です。

■Windows PhoneのXML解析

取得したXMLを解析し、HotelInfoをいうエンティティクラスのインスタンスに情報をセットし、
それをListBoxにバインドしているObservableCollectionに積めていきます。

SilverlightでXMLを解析する方法はいくつかの選択肢があります。
PCのSilverlightの場合、個人的に「XmlSerializer」を使用して、XMLをオブジェクトへデシリアライズ
する方法を好んでいるのですが、Windows Phoneの場合、使用できるリソースに制限があるため、
最も軽い方法を選択しようと「XmlReader」を使用することにしました。

参考:「XML解析のパフォーマンス比較」

  using (XmlReader xmlReader = XmlReader.Create(new StringReader(xml)))
  {
      HotelInfo hotelInfo = null;
      bool isHotelNode = false;
      String elementName = null;

      while (xmlReader.Read())
      {
          if (xmlReader.NodeType == XmlNodeType.Element)
          {
              if (xmlReader.Name.Equals("hotel"))
              {
                  isHotelNode = true;
                  hotelInfo = new HotelInfo();
              }
              else
              {
                  if (isHotelNode)
                  {
                      elementName = xmlReader.Name;
                  }
              }
          }
          else if (xmlReader.NodeType == XmlNodeType.Text)
          {
              if (isHotelNode)
              {
                  switch (elementName)
                  {
                      case "hotelNo" :
                          hotelInfo.HotelNo = xmlReader.Value;
                          break;
                      case "hotelName" :
                          hotelInfo.HotelName = xmlReader.Value;
                          break;
                      case "access" :
                          hotelInfo.Access = xmlReader.Value;
                          break;

                  }
              }
          }
          else if (xmlReader.NodeType == XmlNodeType.EndElement)
          {
              if (xmlReader.Name.Equals("hotel"))
              {
                  isHotelNode = false;
                  hotelList.Add(hotelInfo);
              }
          }
      }
  }

ソースはちょっと冗長になってしまっているので、ご参考までに。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/107-13e12bcd

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。