ちょっとした英訳を知りたい時に使える、デ辞蔵のREST APIを使った和英辞典プログラム

2013年9月27日(金)
薬師寺 国安

ロジックコードを記述する

リスト2 (MainWindow.xaml.vb)

Option Strict On

最新のHTTPアプリケーション用のプログラミングインターフェイスを提供するクラスの含まれる、System.Net.Http名前空間をインポートします。

Imports System.Net.Http

コンテキストメニューおよびメッセージダイアログのサポートを提供するクラスの含まれる、Windows.UI.Popups名前空間をインポートします。

Imports Windows.UI.Popups

dicInfoクラス内に、文字列型の「英文」、「意味」というプロパティを定義しておきます。

Public Class dicInfo
  Public Property 英文 As String
  Public Property 意味 As String
End Class

Public NotInheritable Class MainPage
  Inherits Page

「Yes」アイコンがタップされた時の処理

入力ボックスが空でない場合は、つまり入力ボックスに何らかの語句が入力された場合の処理です。
変数dicUrにデ辞蔵のREST APIであるURLを格納します。DicにEdictJEを指定し、Wordに、エスケープ表現に変換された、dicTextBoxの値を指定します。DicにEJdictを指定すると、今の処理とは逆の英和辞典の処理が可能になります。興味のある方は、EJdictに変更してお試しください。その場合、入力ボックスには英文の語句を入力する必要があります。
新しいHttpClientのインスタンスmyHttpClientオブジェクトを作成します。
GetStringAsyncメソッドで、変数dicUriから返される結果XMLを取得して変数resultDicXmlに格納します。
返されたXMLには不要な名前空間等が付いていますので、XMLの内容を取り出す際の邪魔になります、そこでReplace関数で、ルート要素をだけに置換します。
XElement.Parseメソッドで置換し返された結果XMLを文字列として読み込みます。変数myItemCountに要素の値を取得して格納します。myItemCount変数の値が0なら、つまり、該当結果が無いなら、「該当する単語がありません。」と表示して、処理を抜けます。
該当する単語があった場合は以下の処理になります。
dicInfoクラス型の新しいリストであるmyDicListオブジェクトを作成します。Decendantsメソッドで全ての子孫要素要素の内容を変数resultに格納しながら、以下の処理を繰り返します。
要素の値を取得し変数dicItemに格納します。変数resultDicUriにデ辞蔵のREST APIであるURLを格納します。DicにEdictJEを指定し、今回はItemに変数dicItemの値を指定します。
新しいHttpClientのインスタンスmyDicHttpClientオブジェクトを作成し、GetStringAsyncメソッドで、変数resultDicUriから返される結果XMLを取得して変数resultMeanXmlに格納します。返されたXMLには不要な名前空間等が付いていますので、XMLの内容を取り出す際の邪魔になります、そこでReplace関数で、ルート要素をだけに置換します。
XElement.Parseメソッドで、置換し返されたresultMeanXmlの内容を文字列として読み込みます。変数englishに要素の値を格納し、変数meanに要素の子要素

のまた子要素
の値を格納します。
englishには英文の語句、meanには意味が格納されます。dicInfoクラスの「英文」プロパティにenglish、「意味」プロパティにmeanの値を指定して、AddメソッドでmyDicListオブジェクトに追加していきます。
GridViewのItemsSourceプロパティにmyDicListオブジェクトを指定します。これで、英文とその意味が上下に分かれて表示されます。
入力ボックスが未入力の場合は、フォーカスを入力ボックスに移します。
デ辞蔵のREST APIで返されるXMLは、最初のAPIでルート要素がで、次に返されるXMLのルート要素はとなります。最初のAPIではの値を取得し、その取得した値を、次のREST APIに指定して、英語とその意味を取得するという2段階になっています。
最初のの値を取得するために返されるXMLの構造は図4になります。ただしこの図は、DicにEJdictを指定した英和辞典になりますが、XMLの構造は和英辞典も同じです。
次にの値を指定して返されるXMLの構造は図5になります。最終的に取り出すのは図5のXMLの構造から取り出すことになります。あくまでも図4と5は英和辞典の結果です。今回のサンプルは和英辞典になりますので、ご注意ください。
  Private Async Sub okButton_Click(sender As Object, e As RoutedEventArgs) Handles okButton.Click
    If dicTextBox.Text <> String.Empty Then
      Dim dicUri = String.Format("http://public.dejizo.jp/NetDicV09.asmx/SearchDicItemLite?Dic=EdictJE&Word={0}&Scope=HEADWORD&Match=STARTWITH&Merge=AND&Prof=XML&PageSize=20&PageIndex=0", Uri.EscapeDataString(dicTextBox.Text))
      Dim myHttpClient As New HttpClient
      Dim resultDicXml = Await myHttpClient.GetStringAsync(dicUri)
      resultDicXml = resultDicXml.Replace("<SearchDicItemResult xmlns:xsi=" & ChrW(34) & "http://www.w3.org/2001/XMLSchema-instance" & ChrW(34) & " xmlns:xsd=" & ChrW(34) & "http://www.w3.org/2001/XMLSchema" & ChrW(34) & " xmlns=" & ChrW(34) & "http://btonic.est.co.jp/NetDic/NetDicV09" & ChrW(34) & ">", "<SearchDicItemResult >")
      Dim dicXmlDoc As XElement = XElement.Parse(resultDicXml)
      Dim myItemCount = dicXmlDoc.Descendants("ItemCount").Value
      If myItemCount = "0" Then
        Dim message = New MessageDialog("該当する単語がありません。")
        Await message.ShowAsync
        Exit Sub
      End If
 
      Dim myDicList As New List(Of dicInfo)
      For Each result In From c In dicXmlDoc.Descendants("DicItemTitle") Select c
        Dim dicItem = result.Element("ItemID").Value
        Dim resultDicUri = String.Format("http://public.dejizo.jp/NetDicV09.asmx/GetDicItemLite?Dic=EdictJE&Item={0}&Loc=&Prof=XML", dicItem)
        Dim myDicHttpClient As New HttpClient
        Dim resultMeanXml = Await myDicHttpClient.GetStringAsync(resultDicUri)
        resultMeanXml = resultMeanXml.Replace("<GetDicItemResult xmlns:xsi=" & ChrW(34) & "http://www.w3.org/2001/XMLSchema-instance" & ChrW(34) & " xmlns:xsd=" & ChrW(34) & "http://www.w3.org/2001/XMLSchema" & ChrW(34) & " xmlns=" & ChrW(34) & "http://btonic.est.co.jp/NetDic/NetDicV09" & ChrW(34) & ">", "<GetDicItemResult>")
        resultMeanXml = resultMeanXml.Replace("<div class=" & ChrW(34) & "NetDicBody" & ChrW(34) & " xml:space=" & ChrW(34) & "preserve" & ChrW(34) & " xmlns=" & ChrW(34) & ChrW(34) & ">", "<div>")
 
        Dim meanXmlDoc As XElement = XElement.Parse(resultMeanXml)
        Dim english = meanXmlDoc.Descendants("span").Value
        Dim mean = meanXmlDoc.Descendants("Body").Elements("div").Elements("div").Value
 
        myDicList.Add(New dicInfo With {.英文 = english, .意味 = mean})
      Next
      GridView1.ItemsSource = myDicList
    Else
      dicTextBox.Focus(Windows.UI.Xaml.FocusState.Pointer)
      Exit Sub
    End If
  End Sub

「kuniyasuのアプリ一覧」ボタンがクリックされた時の処理

私の作者名kuniyasuをクエリに指定して、Windows ストアに公開している私のアプリ一覧を表示します。
この画面から、もとの画面に戻るには、画面の左隅上にマウスカーソルを移動し、表示されるこのアプリの小さな画面をタップすると戻ることができます。

  Private Async Sub myApps_Click(sender As Object, e As RoutedEventArgs) Handles myApps.Click
    Dim myAppsUri = New Uri("ms-windows-store:Search?query=kuniyasu")
    Await Windows.System.Launcher.LaunchUriAsync(myAppsUri)
  End Sub
End Class
図4:英和辞典のXMLの構造。が取得されている(クリックで拡大)
図5:を指定した結果のXMLの構造(クリックで拡大)

アイコンの作成

詳細については、「自分の現在位置を取得して表示するサンプルプログラム」の記事を参照してください。

今回はここまでです。ありがとうございました。

  • ちょっとした英訳を知りたい時に使える和英辞典プログラム

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています