最近地道に勉強してきてたStringTemplateだけど、仕事でちょいと使った。
Javaのプログラムで、500行以上のデータがDBにある場合は500行以上取得しないって処理を書いてた。
普通の単体テスト用のデータは10件しか用意してなかったけど500件ぶんのデータを用意するのはダルイ!!
ちなみに、DbUnitのフラットXMLの形でテストデータは用意してる。
大体↓のような感じ。
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<テーブル名 カラム名="値1" カラム名2="値2" />
<テーブル名 カラム名="値1" カラム名2="値2" />
...
</dataset>
ということで、StringTemplate使ってさくっと作ってみた。
まずは、テンプレートから。
Xml.stg
group xml;
xml(ids) ::=<<
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
$ids:record(id=it); separator="\n"$
</dataset>
>>
record(id) ::=<<
<テーブル名 ID="$id$" Name="太郎$id$" Age="$id$" />
>>
んで、このテンプレートを読み込んでXMLファイルを生成するプログラムを用意する。
using System;
using System.IO;
using System.Linq;
using Antlr.StringTemplate;
using Antlr.StringTemplate.Language;
namespace XmlGen
{
class Program
{
static void Main(string[] args)
{
var group = new StringTemplateGroup(
new StreamReader(typeof(Program).Assembly.GetManifestResourceStream("XmlGen.Xml.stg")),
typeof(DefaultTemplateLexer));
var xml = group.GetInstanceOf("xml");
xml.SetAttribute("ids", Enumerable.Range(1, 30000).ToArray());
using (var w = new StreamWriter("data.txt"))
{
w.WriteLine(xml);
}
}
}
}
実行すると、↓みたいなXMLがファイルに吐き出される。
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<テーブル名 ID="1" Name="太郎1" Age="1" />
<テーブル名 ID="2" Name="太郎2" Age="2" />
...中略...
<テーブル名 ID="29999" Name="太郎29999" Age="29999" />
<テーブル名 ID="30000" Name="太郎30000" Age="30000" />
</dataset>
因みに、Rubyで書くとこんな感じかなぁ。
require 'erb'
erb = ERB.new(<<EOS, nil, "-")
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<%- ids.each do |id| -%>
<テーブル名 ID="<%= id %>" Name="太郎<%= id %>" Age="<%= id %>" />
<%- end -%>
</dataset>
EOS
ids = (1..30000)
erb.run binding
うむ。Rubyで書くべきだったか。