freemarker的recurse示例代码

转载必须注明文章来源:renjie120.iteye.com

 

关于freemarker的recurse的用途,在百度和中文指南中,有很多的说明,都是千篇一律。

找了半天却没有找到关于如何具体对一个xml进行遍历解析的例子。

 

这里给出一个示例的例子:

xml文件:

 

<book>
	<title>spring &amp; struts2 &amp; 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

你可能感兴趣的:(freemarker)