关于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> <#recurse> <#-- <#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节
标题 《第二章》
细节: 2.1节
细节: 2.2节
细节: 2.3节
----作者:刘德华 创作时间:2013-1-1
标题 《第二章》
细节: 2.1节
细节: 2.2节
细节: 2.3节
说明:对于recurse指令,会从根对象“doc”(因为java代码中设置的根对象时doc)开始进行网下逐层级的解析xml,首先第一层是“book”,第二层是“title”,“chapter”,第三层是“para”,“title”.
访问了一层的话,要访问后面的层次的话,必须再继续嵌套使用<#recurse>。
访问xml节点的属性,使用.@属性名。判断属性是否存在,使用方式见ftl中。