2

CastleNVelocityの使用で奇妙な問題が発生しました...

テンプレート文字列が$文字で終わる場合、次の例外がスローされます。

字句エラー:NVelocity.Runtime.Parser.TokenMgrError:行1、列94で字句エラー。発生:後: ""

文字列の最後にスペースやその他の文字を追加すると、期待どおりに機能します。

誰かがこれの回避策を持っていますか?

問題を再現するサンプルコードを次に示します。

class Program
{
    static void Main(string[] args)
    {
        var result = Merge("The quick brown ${Animal} jumps over the lazy dog$", new List<KeyValuePair<string, string>>() { new KeyValuePair<string, string>("Animal", "fox") });

        Console.WriteLine("Success: {0}", result.Key);
        Console.WriteLine("Message: {0}", result.Value);
        Console.Read();
    }

    public static KeyValuePair<bool, string> Merge(string template, IList<KeyValuePair<string, string>> data)
    {
        var ret = new KeyValuePair<bool, string>(false, null);
        try
        {
            if (data != null)
            {
                var engine = new VelocityEngine();
                engine.Init();

                var context = new VelocityContext();
                foreach (var tokenData in data)
                {
                    context.Put(tokenData.Key, tokenData.Value);
                }

                var templateContent = template;

                var sb = new StringBuilder();
                var textWriter = new StringWriter(sb);

                engine.Evaluate(context, textWriter, String.Empty, templateContent);

                ret = new KeyValuePair<bool, string>(true, sb.ToString());
            }
        }
        catch (Exception ex)
        {
            ret = new KeyValuePair<bool, string>(false, ex.Message);
        }
        return ret;
    }
}
4

2 に答える 2

2

いくつかのオプションがあります。

マージする入力文字列に影響を与えない場合は、少なくともマージプロセスでは、末尾にドル文字がないことを確認してください。

例:

bool dollarAtEnd = false;

if (input.EndsWith('$'))
{
   input += " "; 
   dollarAtEnd = true;
}

var result = Merge(input, ...);

if (dollarAtEnd)
{
   result = result.Substring(1, result.Length - 1);
}

入力文字列を制御できるが、それらの一部がドル文字で終わる必要があるという要件しかない場合は、次のように実行できます。

例:

"#set($dollar='$')The quick brown ${Animal} jumps over the lazy dog$dollar"

または、「ドル」をインラインで指定するのではなく、変数としてVelocityContextに渡します。

于 2012-05-03T10:14:46.323 に答える
0

$変数名の開始を示します。$リテラルを使用する場合は、それをにエスケープする必要があります\$

http://velocity.apache.org/engine/devel/user-guide.html#Getting_literal

于 2012-05-03T10:14:39.757 に答える