読者です 読者をやめる 読者になる 読者になる

はまったりひらめいたり…とか…

.Net系プログラムで勉強したこととか嵌ったことについて書いたりします。

Xamarinでもくもくしたお話し

Xamarin

今日、昨日と両日もくもく会に参加してました。

JXUG東京もくもく会と、業務系システム開発勉強会でもくもくしていました。

どっちもXamarinでもくもくしました。一応それらの進展を。

ListViewにViewModelをバインドしようというお話。

まずは参考

ListView Data Sources - Xamarin

ytabuchi.hatenablog.com

ソース

まぁなんてことはない、普通のListViewバインディングです。

ViewModelとListViewのバインディングはかなり簡単に行えます。

//今回は初期ViewModelのデータをつっこんでおく
var searchInfo = new ObservableCollection<SearchInfo>
{
    new SearchInfo { Detail = "高橋 慶太郎", SearchType = ComicTokutenEnum.SearchType.AuthorSearch},
    new SearchInfo { Detail = "弐瓶 勉", SearchType = ComicTokutenEnum.SearchType.AuthorSearch},
    new SearchInfo { Detail = "Pumpkin Scissors", SearchType = ComicTokutenEnum.SearchType.TitleSearch},
    new SearchInfo { Detail = "メイドインアビス", SearchType = ComicTokutenEnum.SearchType.TitleSearch}
};

//データバインド
this.BindingContext = searchInfo;

実行結果

トグルの画面が崩れるのはエミュレータゆえなのかなぁ? f:id:TakasDev:20160612233854p:plain

ModernHttpClient + HtmlAgilityPack

XamarinでWebページを解析しよう!というお話。

こちらも比較的簡単に実現できました。

まずは参考

blog.ch3cooh.jp

Xamarin のプロジェクトで NuGet を使用する : XLsoft エクセルソフト

ModernHttpClient

Nativeに依存しないWeb通信が可能となる。

NugetでGet可能。 f:id:TakasDev:20160612233112p:plain

HtmlAgilityPack

.NetのHTMLパーサーの定番。

NuGetの取得だけでも使用できるようになっているようです。

f:id:TakasDev:20160612233217p:plain

処理。

"@CH3COOHさんの処理内容にModernHttpClientの使用を追加した感じです。

ほぼ同内容の処理は下コードな感じになりました。 (パース部分はちょっと手抜きしてますけど)

・ソース

//画面EntryからCode値を取得
var code = CompanyId.Text;
var urlstring = string.Format("http://stocks.finance.yahoo.co.jp/stocks/detail/?code={0}", code);

var httpClient = new HttpClient(new NativeMessageHandler());
var response = await httpClient.GetAsync(urlstring);

//html取得
var html = await response.Content.ReadAsStringAsync();

//AgilityPackにぶっこみ
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

//解析解析
var priceNode = doc.DocumentNode.Descendants("td")
    .Single(node => node.GetAttributeValue("class", "") == "stoksPrice");

var companyNode = doc.DocumentNode.Descendants("th")
    .Single(node => node.GetAttributeValue("class", "") == "symbol");

//表示
this.Outputlabel.Text = string.Format("{0}({1})の株価: {2}円", companyNode.InnerText, CompanyId.Text, priceNode.InnerHtml);

実行結果

f:id:TakasDev:20160612233803p:plain

後回しにしたこと

本当はAmazonの商品検索APIを使用して

XMLの解析をしてみたかったのだけど、Amazonが提供しているサンプル

SignedRequestHelperがSystem.Webをバリバリ使っているんで

結構書き直さなきゃいけない印章。

参考: Product Advertising API Signed Requests Sample Code - C# REST/QUERY : Sample Code & Libraries : Amazon Web Services

blog.nakajix.jp

もくもく会中にViewに表示できるなにかを作りたかったので

後に回しました(時間が余って作業したけど結局Amazonのは終わらなかった…)

最後に

もくもく会楽しかったのでまた参加したいです。