前回の記事で、位置情報の取得部分を紹介したので、今回は、楽天のWebAPIから周辺の施設情報を取得する部分を紹介します。
■Windows PhoneのWeb接続
Windows PhoneからのWeb接続は、「WebClient」を使用する方法が最もシンプルです。
検索ボタンのイベントハンドラで以下のように、記述しています。
[MailPage.xaml.cs]
「Silverlight」のWebClientには同期型のダウンロードメソッドが提供されていないので、
Web接続は、必ず非同期で実施することになります。
ダウンロードの結果は、DownloadStringCompletedEventArgsのResultプロパティから取得することが可能です。
■Windows PhoneのXML解析
取得したXMLを解析し、HotelInfoをいうエンティティクラスのインスタンスに情報をセットし、
それをListBoxにバインドしているObservableCollectionに積めていきます。
SilverlightでXMLを解析する方法はいくつかの選択肢があります。
PCのSilverlightの場合、個人的に「XmlSerializer」を使用して、XMLをオブジェクトへデシリアライズ
する方法を好んでいるのですが、Windows Phoneの場合、使用できるリソースに制限があるため、
最も軽い方法を選択しようと「XmlReader」を使用することにしました。
参考:「XML解析のパフォーマンス比較」
ソースはちょっと冗長になってしまっているので、ご参考までに。
■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」を使用すると、シンプルに処理を記述することが可能になります。
これについては、別に記事にしたいと思っています。
非同期処理の場合、処理が入れ子になって、ソースが見づらくなる傾向があります。
別の方法として、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