转载必须注明文章来源:renjie120.iteye.com
关于freemarker的recurse的用途,在百度和中文指南中,有很多的说明,都是千篇一律。
找了半天却没有找到关于如何具体对一个xml进行遍历解析的例子。
这里给出一个示例的例子:
xml文件:
<book> <title>spring & struts2 & hibernate</title> <chapter author="周润发" address="上海"> <title>第一章</title> <para>1.1节</para> <para>1.2节</para> </chapter> <chapter author="刘德华" time="2013-1-1"> <title>第二章</title> <para>2.1节</para> <para>2.2节</para> <para>2.3节</para> </chapter> </book>
ftl文件:
<#compress> <#recurse doc> <#macro book> 欢迎使用本书籍---------------<#recurse> </#macro> <#macro title> 标题 《<#recurse>》 </#macro> <#macro chapter> <#-- <#if .node.@address??> 地点:${.node.@address}</#if> --> ----作者:${.node.@author} <#if .node.@time[0]?? >创作时间:${.node.@time}</#if> <#if .node.@address[0]?? >创作地点:${.node.@address}</#if> <#recurse> </#macro> <#macro para> 细节: <#recurse> </#macro> </#compress>
java代码:
public class XmlMarkerTest {
public static void main(String[] agrgs) {
Writer out = new OutputStreamWriter(System.out);
new Generate("book.ftl", out) {
public Object setData() {
Map m = new HashMap();
try {
m.put("doc", freemarker.ext.dom.NodeModel.parse(new File(
"D:\\My Documents\\GitHub\\dwz_money\\template\\data.xml")));
} catch (Exception e) {
e.printStackTrace();
}
return m;
}
}.make();
System.out.println("\n\n生成完毕");
}
}
package common.codegenerate;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public abstract class Generate {
String ftlname;
Writer out;
public Generate(String ftlname, Writer out) {
this.ftlname = ftlname;
this.out = out;
}
abstract Object setData();
public void make() {
try {
Configuration cfg = new Configuration();
File f = new File("template");
cfg.setDirectoryForTemplateLoading(f);
cfg.setObjectWrapper(new DefaultObjectWrapper());
Template temp = cfg.getTemplate(ftlname);
Object data = setData();
temp.process(data, out);
out.flush();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
}
输出结果:
欢迎使用本书籍---------------
标题 《spring & struts2 & hibernate》
标题 《第一章》
细节: 1.1节
细节: 1.2节
----作者:周润发 创作地点:上海
标题 《第一章》
细节: 1.1节
细节: 1.2节
----作者:刘德华 创作时间:2013-1-1
标题 《第二章》
细节: 2.1节
细节: 2.2节
细节: 2.3节
说明:对于recurse指令,会从根对象“doc”(因为java代码中设置的根对象时doc)开始进行网下逐层级的解析xml,首先第一层是“book”,第二层是“title”,“chapter”,第三层是“para”,“title”.
访问了一层的话,要访问后面的层次的话,必须再继续嵌套使用<#recurse>。
访问xml节点的属性,使用.@属性名。判断属性是否存在,使用方式见ftl中。
转载必须注明文章来源:renjie120.iteye.com