如何在FreeMarker中根据日期打印XML列表中的指定价格
解决FreeMarker从XML列表按日期key取价格的问题
首先我先根据你的描述推测下XML的大致结构(应该是类似这样的key-value节点结构):
99.85301833 100.xxxx
下面给你几种可行的写法,你可以根据实际的XML解析情况选择:
1. 直接过滤匹配指定日期(最便捷)
如果allProductPrices下是一堆带key属性的节点,用FreeMarker的?filter过滤器就能快速定位目标价格:
<!-- 获取2017-03-31对应的价格 --> ${reportData.allProductPrices.entry?filter(x -> x.@key == "2017-03-31")?first}
这里的@key是用来访问XML节点的属性,?filter负责筛选出符合日期条件的节点,?first取筛选后的第一个节点(毕竟日期key应该是唯一的),它的文本内容就是你要的价格。
2. 循环遍历+条件判断(适合遍历或容错场景)
如果你需要遍历所有日期,或者担心指定的日期不存在会导致页面报错,可以用列表循环结合条件判断:
<#list reportData.allProductPrices.entry as priceItem> <#if priceItem.@key == "2017-03-31"> 日期2017-03-31的价格:${priceItem} </#if> </#list>
3. 当成Map直接访问(如果框架已解析成Map)
有些XML解析框架会把这种key-value结构的节点直接解析成FreeMarker的Map对象,这种情况下就更简单了,直接用键值对的方式访问:
${reportData.allProductPrices["2017-03-31"]}
(因为日期里包含横杠,用方括号访问比点语法更稳妥)
额外容错提示
如果担心指定的日期可能不存在,记得加上默认值避免页面报错:
<!-- 过滤方式的默认值 --> ${reportData.allProductPrices.entry?filter(x -> x.@key == "2017-03-31")?first!"无对应价格"} <!-- Map方式的默认值 --> ${reportData.allProductPrices["2017-03-31"]!"无对应价格"}
内容的提问来源于stack exchange,提问作者aj_bk
相关产品推荐
相关产品推荐

