備忘録

備忘録

C#でYahooAPIのルビ振りを利用する方法

Ⅰ. はじめに

タイトルの通り「C#でYahooAPIのルビ振りを利用する方法」です。

Ⅱ. サンプルプログラム

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Xml.Linq;

static async Task Main(string[] args)
{
  var grade = 1;
  var appId = "YOUR_APP_ID";
  var sentence = "漢字だけにルビを振る。ひらがなカタカナalphabet";

  // YahooAPI側のcharset指定が不正なのでGetStringAsyncするとSystem.InvalidOperationExceptionが発生する
  var bytes = await new HttpClient().GetByteArrayAsync($"https://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid={appId}&grade={grade}&sentence={Uri.EscapeUriString(sentence)}");
  var str = Encoding.UTF8.GetString(bytes);
  var xml = XElement.Parse(str);
  var ns = xml.GetDefaultNamespace();
  
  Console.WriteLine("■ローマ字");
  foreach (var word in xml.Element(ns + "Result").Element(ns + "WordList").Elements(ns + "Word"))
  {
    Console.WriteLine(word.Element(ns + "Roman")?.Value);
    if (word.Element(ns + "SubWordList")?.HasElements ?? false)
    {
      foreach (var subWord in word.Element(ns + "SubWordList").Elements(ns + "SubWord"))
      {
        Console.WriteLine($"\t{subWord.Element(ns + "Roman")?.Value}");
      }
    }
  }

  Console.WriteLine("■ひらがな");
  foreach (var word in xml.Element(ns + "Result").Element(ns + "WordList").Elements(ns + "Word"))
  {
    Console.WriteLine(word.Element(ns + "Furigana")?.Value);
    if (word.Element(ns + "SubWordList")?.HasElements ?? false)
    {
      foreach (var subWord in word.Element(ns + "SubWordList").Elements(ns + "SubWord"))
      {
        Console.WriteLine($"\t{subWord.Element(ns + "Furigana")?.Value}");
      }
    }
  }
}

Ⅲ. 出力

f:id:kagasu:20180215034457p:plain