web-dev-qa-db-ja.com

C#テンプレートエンジン

C#コードから簡単に使用できるスタンドアロンのテンプレートエンジンを探しています。データのプレースホルダーを使用してHTMLファイルとXMLファイルを作成し、コードからのデータをそれらに入力したいと思います。

エンジンは、ループ(テンプレートの一部を複数のオブジェクトから複製する)と条件(一部の条件が真である場合にのみ、テンプレートの一部を最終的なHTML/XMLに追加する)をサポートする必要があります。誰かが私のために良いオプションをお勧めし、そのようなコードサンプルへのリンクを追加したり、私のニーズに合わせて推奨コンポーネントを使用する方法についてのドキュメントを追加したりできますか?

また、ループを使用して、テーブル行、またはテーブル全体(HTMLバージョン)および複雑な要素(XMLバージョン)を複製する必要があります。

67
me

StringTemplate を使用しましたが、良い結果が得られました。いくつかのリソース:

22
Fredrik Mörk

RazorViewエンジンの使用方法に関する素敵な記事があります。 RazorEngineを使用してローカライズ可能なテキストテンプレートエンジンを作成する方法

17
Malkov

T4はどうですか Text Template Transformation Toolkit ?要件に適合し、Visual Studioに組み込まれています。

素晴らしいT4リソース:

Oleg Sychのブログ

T4エディター

T4ツールボックス

16
Paolo Tedesco

SmartFormat は、すべての要件を満たす非常にシンプルなライブラリです。 「自然言語」テキストの作成に焦点を当てており、リストからデータを生成したり、条件ロジックを適用したりするのに最適です。

構文はString.Formatと非常に似ており、非常にシンプルで簡単に習得して使用できます。ドキュメントの構文の例を次に示します。

Smart.Format("{Name}'s friends: {Friends:{Name}|, |, and}", user)
// Result: "Scott's friends: Michael, Jim, Pam, and Dwight"

このライブラリはオープンソースであり、簡単に拡張できるため、追加機能を使用してライブラリを拡張することもできます。

10
Scott Rippey

[〜#〜] xslt [〜#〜] を見ましたか?データオブジェクトをxmlserializingするなどして、XMLのソースデータ形式から開始する必要があります。 ループ および ifステートメント を簡単に実行できます!

キャスリーンダラードには XSLTによるコード生成に関する本 があります。

個人的には、私は T4 (特にC#を生成する場合)の大ファンですが、XMLとHTMLが出力タイプであるため、XSLTがカバーしていることに気付くかもしれません。さらに、非常にクロスプラットフォームです。

6

私のクラスライブラリには、古いスタイルのASP、またはT4に似た外観と動作をするテンプレートエンジンが組み込まれています。

基本的にC#コードを<%%>ブロックで記述するため、C#でできることのほとんどを実行できますが、テンプレートファイル全体が単一のメソッドにコンパイルされるという制限があります。つまり、テンプレート内でヘルパークラスなどを定義することはできませんが、ヘルパーメソッドの場合は匿名メソッドを実行できます。

例:

<%
    var firstname = "Bob";
    var count = 10;

    for (Int32 index = 0; index < count; index++)
    {
%>
<%= firstname %> x <%= index+1 %>/<%= count %>
<%
    }
%>

これは別のappdomainのC#クラスにコンパイルされ、生成されたテキストを含む文字列を返すために実行できます。

また、テンプレートに引数を渡し、クラスライブラリを参照することもできます。つまり、カスタムデータ構造を渡したり、テンプレートからデータアクセス層やビジネスロジックコードにアクセスしたりできます。

ご覧になりたい場合は、SubversionリポジトリまたはWebページからクラスライブラリのコードを入手できます。

Subversionリポジトリの場合、ユーザー名とパスワードが必要です。両方とも引用符なしの「ゲスト」です。

コードはLVK.Text.Templatingプロジェクト/アセンブリにあります。

また、お知らせください(プロファイルページでメールを参照するか、コメントを残してください)。さらに例をいくつか示します。

これが必要になる場合があります 。NET Template Engine

テンプレートコード:

$Book.StaticId$

ID: $bk.BookId$ - Author: $bk.Author.Name$

Length of the author's Name: $bk.Author.Name.Length$

C#コード:

class Author
   {
       public string Name
       {
           get
           {
               return "John Borders";
           }
       }
   }
   class Book
   {
       public static string StaticId
       {
           get
           {
               return "AABB";
           }
       }
       public int BookId
       {
           get
           {
               return 100;
           }
       }
       public Author Author
       {
           get
           {
               return new Author();
           }
       }
   }
   public class PropertySample1
   {
       [STAThread]
       static void Main()
       {
           TemplateEngine dt = new TemplateEngine();
           dt.LoadFromFile("Template.tpl");
           Book book = new Book();
           dt.SetValue("bk", book);
           dt.UsingNamespace("CSharp,Demo");
           string output = dt.Run();
           Console.WriteLine(output);
       }
   }

出力は次のとおりです。

AABB

ID: 100 - Author: John Borders

12
1