读取XML模板时出现了StringTemplate无效字符“<”。

9

我试图创建一个简单的XML模板,目前只包括:

<?xml version="1.0"?>

我像这样读取文件:
    STGroup group = new STGroupDir("templates");
    ST st = group.getInstanceOf("report");
    st.add("analysis", ana);
    String result = st.render();
    System.out.println(result);

结果会出现多个错误信息:

report.st 1:1: invalid character '<'
report.st 1:1: invalid character '?'
report.st 1:19: invalid character '?'
report.st 1:20: invalid character '>'
report.st 1:2: no viable alternative at input 'xml'

我看到其他人在阅读使用标签的HTML模板。那么我做错了什么吗?

它是空的:你只是声明了文档类型。 - Artem Oboturov
尝试使用检查器 http://www.antlr.org/wiki/display/ST4/StringTemplate+Inspector+GUI。 - Artem Oboturov
1
它不期望 XML 文件作为输入。请参阅以下语法:http://www.antlr.org/wiki/display/ST4/StringTemplate+cheat+sheet。 - Artem Oboturov
抱歉,我还是不明白。我尝试转义了 < 和 >,但仍然没有帮助。 - er4z0r
3个回答

6

好的,看起来我忽略了您需要以不同的语法指定模板。 尽管这并不明显从我使用的示例中:

我的工作模板现在看起来不同了:

report (analysis) ::= <<
<?xml version="1.0"?>
>>

此外,我还更改了分隔符:
STGroup group = new STGroupDir("templates",'$','$');

当你说根本不期望 XML 的时候,我就告诉过你了。 - Artem Oboturov
1
如果你想要一个真正意义上的模板,可以看看Freemarker。 - Artem Oboturov
2
是的。尽管Terrence Parr一直说StringTemplate是良好的模型/视图分离,但我无法想象有哪个设计师会费心为此编写模板。 - er4z0r
如果您正在编写Java代码来处理模板,请使用以下代码仅加载原始模板文件:ST st = new ST("your xml here", '$', '$'); 然后您的模板将不需要像report(analysis) ::= << ... >>这样的模板声明。 - jbuhacoff
1
ST默认使用<>作为分隔符。只要您传递“自定义”分隔符,就不必更改模板中的任何内容。请注意,我正在使用最新的(4.3)版本。 - krizajb

3

我发现你也可以转义尖括号:

report(analysis) ::= <<
\<?xml version="1.0"?>
>>

请注意在<?xml之前的\ -- 此外,它足够智能,不需要在?>闭合括号处再次转义。
我认为Terrence Parr所建议的模型/视图分离是指视图从未真正有机会操纵传递给模板的基础数据结构(或模型)。这是通过将模板“应用”于数据或集合来实现的,而不是在模板中循环处理数据。也许这是微妙的,也许在实践中(对于设计师)有点过于纯粹。

这种方法对我非常有效(我使用的是StringTemplate 4.0.8)。我投赞成票,因为有时候只需向模板添加反斜杠就比替换或查找未使用的字符更容易。 - cleberz

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接