C#でStringTemplate【導入編】

こんにちは、サイオステクノロジーの佐藤 陽です。

最近、テンプレートエンジンであるStringTemplate を使う機会がありました。
非常に便利だったので、使い方のメモも兼ねて記事として残したいと思います。

  • テンプレートエンジンって何?
  • C#でテンプレートエンジン使ってみたい!

という方は是非最後までご覧ください!

StringTemplate とは?

StringTemplate とはテンプレート・エンジンです。

もともと Java 用のものとして使われていたようですが

現在は

  • C#
  • Objective-C
  • JavaScript
  • Scala

でも利用できるようです。

今回はC#のものを利用しました。

なお、C#版に関してはこちらの記事にも内容が分かりやすくまとまっているのですが
2009 年の記事だったので、アップデートという意味もこめ、改めて自分の方でまとめてみました。

テンプレートエンジンとは?

そもそもテンプレートエンジンとは何でしょうか?

最近だとテンプレートという言葉も馴染み深くなってきましたが、
日本語でいうと「ひな形」という言葉が当たると思います。

例えば、会社に入社してくれた人に向けて、以下のようなメールを送るとします。

こんにちは サイオス 太郎 さん

私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。

この時、[サイオス 太郎] の部分に関しては、社員ごとに動的に変える必要があります。

こういう時に便利なのがテンプレートエンジンです。
使いまわすテンプレートとしては

こんにちは [社員名] さん

私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。

といったものを用意しておき、
[社員名] の部分を動的に変えることで、メールの内容を切り替えることが可能となります。

StringTemplate の使い方

それでは、実際に StringTemplate を使っていきたいと思います。

下準備

今回はC#ということで、.NETのコンソールアプリを題材に行っていきます。
環境としては.NET6で行っています。

以下のコマンドでサクッとプロジェクトを作成します。

dotnet new console -n stringtemplate -o stringtemplate

作成が完了したら、Program.cs に以下のようなコードを書いていきます。

string body = @"
こんにちは サイオス太郎 さん

私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。
";

Console.WriteLine(body);

こうすると、Consoleに本文が表示されます。
ここから名前の部分を動的に変更できるようにしていきます。

StringTemplate導入

では早速このコードにStringTemplateを導入していきます。
NuGetパッケージとして公開されているので、インストールします。

dotnet add package StringTemplate4 --version 4.0.8

VisualStudioを使ってる方はNuGet パッケージマネージャーからもインストール可能です。

StringTemplate適用

StringTemplateの仕様として、動的に変更したい文字列を`<`と`>`で囲います。
(@ITさんの記事には`$`で囲っても可能と書いてありましたが、自分の環境では上手く動きませんでした。)

string body = @"
こんにちは <name> さん

私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。
";

これに対して、StringTemplateを適用していきます。

  1. using句で必要なpackageを読み込みます
  2. テンプレートの文字列を引数として、Templateクラスのインスタンスを作成します
  3. 変数に値を追加します
  4. Render()メソッドを呼び出し、文字列を生成します
using System.Globalization;
using Antlr4.StringTemplate;

string body = @"
こんにちは <name> さん

私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。
";

Template templateBody = new(body);
templateBody.Add("name", "サイオス太郎");
string renderedBody = templateBody.Render(new CultureInfo("ja-JP"));

Console.WriteLine(renderedBody);

そうすると、Renderされた文字列が表示されました。

こんにちは サイオス 太郎 さん
私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。

これだけシンプルな内容だと、
「stringのReplace()メソッドでいいじゃん」と思われそうなので、もう少し踏み込んでみたいと思います。

条件分岐

StringTemplateでは、Templateファイル内で条件分岐も可能です。
早速、例を見てみます。

string body = @"
<if (isFormal)>
こんにちは <name> 様
<else>
こんにちは <name> さん
<endif>

私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。
";

Template templateBody = new(body);
templateBody.Add("name", "サイオス太郎");
templateBody.Add("isFormal", true); //true固定とする
string renderedBody = templateBody.Render(new CultureInfo("ja-JP"));

Console.WriteLine(renderedBody);

すると以下のように出力されました。

isFormalのif文が効いていることが確認できます。

こんにちは サイオス太郎 様
私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。

反復処理

また、反復処理も可能です。
(今回の例題だと不自然ですがあくまで実装の例として…)

using System.Globalization;
using Antlr4.StringTemplate;

string body = @"

こんにちは
<names:{n|<n>さん }>

私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。
";

Template templateBody = new(body);
templateBody.Add("names", new[] { "サイオス太郎", "サイオス花子"} );
string renderedBody = templateBody.Render(new CultureInfo("ja-JP"));

Console.WriteLine(renderedBody);

すると以下のように出力されました。

こんにちは
サイオス太郎さん サイオス花子さん

私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。

使いどころ

恐らくですが、もともとテンプレートエンジンは主にHTMLファイルの生成に利用されていた背景があるのではないかと思います。

ただ、HTMLファイル生成以外でも、今回のようなメールの本文作成や、ログの出力、Configファイルの生成など、利用用途は無限大です。

また、今回は簡略化のため、テンプレート文字列をC#のコード内に記述しましたが、本来であれば別の場所に置いておき、それを読み込んで利用するべきです。
そうすることで、コードとテンプレートファイルの結合度をぐっと下げることが可能です。

まとめ

今回は、C#版のStringTemplateを使ってみました。
基本的な機能を使っただけなので、あまり有用性は感じてもらえなかったかもしれないですね…。

今後も色々使い方を探ってみたいと思います。
また、機会があれば実際の環境を想定し、テンプレートが別場所に管理されている場合の実装もご紹介したいと思います。

→書きました

C#でStringTemplate【実践編】

ではまた!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です