FreeMaker读取XML数据源

FreeMark2.3支持 XML;在程序中可直接把xml文件作为数据模型,按用户模板文件的要求,输出相应的文件(或流)给用户。 

与前面相比,关键有: 

引用   
    1 freemarker.ext.dom.NodeModel.parse这个方法将把xml文件处理成map树状结构的模型;该方法支持以File对象,读xml;也提供了一个流适配器,从面能用InsputStream流对象读xml文件。 

  2 Map root = new HashMap(); 
    root.put("doc", freemarker.ext.dom.NodeModel.parse( ins)); 
    这里要注意:经处理后:”doc”,在数据模型中是根;而xml文件的根是它的子节点; 
    在读数据时,要从doc开始,否则出错。当然,”doc”也可改成其他名字。 

  3 增加了一个recurse指令。 
    FreeMarker这样处理的xml结构的数据模型的: 
    (1)  按层定义宏;宏名---就是节点名。(这是强行约定的) 
    (2)  recurse----将循环调用处理子节点的宏 
  





下面是在java应用程序中,应用freemarker的示例: 

(1) ddd.xml 
注意 ddd.xml位于classpath下的jap1文件夹下,与下面的 FMtest.java的位置相同。在netbean开发环境中,位于 src/java/jsp1下。 [size=medium] 

Xml代码   
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <root>  
  3.      <user>  
  4.          <name>张三1111</name>  
  5.      </user>  
  6.      <user>  
  7.          <name>李四hhhh</name>  
  8.      </user>  
  9. </root>  
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <root>  
  3.      <user>  
  4.          <name>张三1111</name>  
  5.      </user>  
  6.      <user>  
  7.          <name>李四hhhh</name>  
  8.      </user>  
  9. </root>  




(2) FMTest.java -------应用freemarker的类 

Java代码   
  1. package jap1;   
  2. import freemarker.template.Configuration;   
  3. import freemarker.template.Template;   
  4. import freemarker.template.TemplateException;   
  5. import java.io.IOException;   
  6. import java.io.InputStream;   
  7. import java.io.StringWriter;   
  8. import java.util.HashMap;   
  9. import java.util.Locale;   
  10. import java.util.Map;   
  11. import javax.xml.parsers.ParserConfigurationException;   
  12. import org.xml.sax.InputSource;   
  13. import org.xml.sax.SAXException;   
  14.   
  15.   
  16. public class FMTest {   
  17.   
  18.     public static void main(String[] args) throws Exception  {   
  19.         FMTest test=new FMTest();   
  20.         test.getFile();   
  21.     }   
  22.   
  23.     @SuppressWarnings("empty-statement")   
  24.     public void getFile() throws IOException, TemplateException,    
  25.             SAXException, ParserConfigurationException{   
  26.   
  27.         //得FreeMarker配置对象   
  28.         Configuration cfg = new Configuration();   
  29.         cfg.setEncoding(Locale.getDefault(), "UTF-8");   
  30.         cfg.setClassForTemplateLoading(this.getClass(),"/jap1");   
  31.         //得FreeMarker的关键对象---------模板   
  32.         Template temp = cfg.getTemplate("test.ftl");   
  33.   
  34.         //得FMTest类运行时/jap1/ddd.xml的输入流文件,以便FreeMarker读出来   
  35.         //注意:FMTest运行时,ddd.xml在工程打包的包中。Java强烈要求只能读包内   
  36.         //文件。如果要得到运行的绝对路径,再用可写的流打包,java会严重抗议!   
  37.         InputStream in =FMTest.class.getResourceAsStream("/jap1/ddd.xml");   
  38.         //下面是FreeMarker的输入接口,这里与上面的in流建立关系,   
  39.         //以便读取ddd.xml文件   
  40.         InputSource ins=new org.xml.sax.InputSource(in);   
  41.   
  42.         Map root = new HashMap();   
  43.         //特别注意此时的doc,这个符号将是,FreeMarker模板中取数的根!!!!!   
  44.         //这里读取xml文件,并处理成root对象   
  45.         root.put("doc", freemarker.ext.dom.NodeModel.parse( ins));   
  46.   
  47.         //建立内存字符串流   
  48.         java.io.StringWriter w =new StringWriter();   
  49.         //模板开始按模板中的要求把用户输入的数据进行转换,并输出到字符串流中   
  50.         temp.process(root, w);   
  51.         //字符串流输出到屏幕   
  52.         System.out.println(w.toString());   
  53.     }   
  54.   
  55. }  
[java]  view plain copy print ?
  1. package jap1;  
  2. import freemarker.template.Configuration;  
  3. import freemarker.template.Template;  
  4. import freemarker.template.TemplateException;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.StringWriter;  
  8. import java.util.HashMap;  
  9. import java.util.Locale;  
  10. import java.util.Map;  
  11. import javax.xml.parsers.ParserConfigurationException;  
  12. import org.xml.sax.InputSource;  
  13. import org.xml.sax.SAXException;  
  14.   
  15.   
  16. public class FMTest {  
  17.   
  18.     public static void main(String[] args) throws Exception  {  
  19.         FMTest test=new FMTest();  
  20.         test.getFile();  
  21.     }  
  22.   
  23.     @SuppressWarnings("empty-statement")  
  24.     public void getFile() throws IOException, TemplateException,   
  25.             SAXException, ParserConfigurationException{  
  26.   
  27.         //得FreeMarker配置对象  
  28.         Configuration cfg = new Configuration();  
  29.         cfg.setEncoding(Locale.getDefault(), "UTF-8");  
  30.         cfg.setClassForTemplateLoading(this.getClass(),"/jap1");  
  31.         //得FreeMarker的关键对象---------模板  
  32.         Template temp = cfg.getTemplate("test.ftl");  
  33.   
  34.         //得FMTest类运行时/jap1/ddd.xml的输入流文件,以便FreeMarker读出来  
  35.         //注意:FMTest运行时,ddd.xml在工程打包的包中。Java强烈要求只能读包内  
  36.         //文件。如果要得到运行的绝对路径,再用可写的流打包,java会严重抗议!  
  37.         InputStream in =FMTest.class.getResourceAsStream("/jap1/ddd.xml");  
  38.         //下面是FreeMarker的输入接口,这里与上面的in流建立关系,  
  39.         //以便读取ddd.xml文件  
  40.         InputSource ins=new org.xml.sax.InputSource(in);  
  41.   
  42.         Map root = new HashMap();  
  43.         //特别注意此时的doc,这个符号将是,FreeMarker模板中取数的根!!!!!  
  44.         //这里读取xml文件,并处理成root对象  
  45.         root.put("doc", freemarker.ext.dom.NodeModel.parse( ins));  
  46.   
  47.         //建立内存字符串流  
  48.         java.io.StringWriter w =new StringWriter();  
  49.         //模板开始按模板中的要求把用户输入的数据进行转换,并输出到字符串流中  
  50.         temp.process(root, w);  
  51.         //字符串流输出到屏幕  
  52.         System.out.println(w.toString());  
  53.     }  
  54.   
  55. }  




(3) test.ftl --------模板文件

Xml代码   
  1. 测试单个读数操作-----${doc.root.user[0].name}   
  2.   
  3. 列表测试:   
  4. <#list doc.root.user as dd>  
  5. ${dd.name}   
  6. </#list>  
  7.   
  8. <#--recurse指令,按层读取整个xml节点,并循环调用处理这些节点的宏-->  
  9. <#recurse doc><#--root是doc的子节点,这里将循环调用<#marco root>宏 -->  
  10. 读doc   
  11. <#macro root>  
  12.  读root <#recurse><#--user是root的子节点,这里将循环调用<#marco user>宏 -->  
  13. </#macro>  
  14. <#macro user>  
  15.    姓名:${.node.name};测试recurse指令,user   
  16. </#macro>  
  1. 测试单个读数操作-----${doc.root.user[0].name}  
  2.   
  3. 列表测试:  
  4. <#list doc.root.user as dd>  
  5. ${dd.name}  
  6. </#list>  
  7.   
  8. <#--recurse指令,按层读取整个xml节点,并循环调用处理这些节点的宏-->  
  9. <#recurse doc><#--root是doc的子节点,这里将循环调用<#marco root>宏 -->  
  10. 读doc  
  11. <#macro root>  
  12.  读root <#recurse><#--user是root的子节点,这里将循环调用<#marco user>宏 -->  
  13. </#macro>  
  14. <#macro user>  
  15.    姓名:${.node.name};测试recurse指令,user  
  16. </#macro>  





(4) 运行结果 

Java代码   
  1. 测试单个读数操作-----张三1111  
  2.   
  3. 列表测试:   
  4. 张三1111  
  5. 李四hhhh   
  6.   
  7.  读root    
  8.         姓名:张三1111;测试recurse指令,user   
  9.   
  10.         姓名:李四hhhh;测试recurse指令,user   
  11.   
  12.   
  13. 读doc   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值