使用freemarker的嵌套xml标签遍历

Posted

技术标签:

【中文标题】使用freemarker的嵌套xml标签遍历【英文标题】:Nested xml tag traversal using freemarker 【发布时间】:2016-06-26 16:08:31 【问题描述】:

我是freemarker的新手,有一个需求需要遍历xml中的递归节点,使用freemarker。

这里是示例 xml 文件的示例:

<?xml version="1.0" encoding="UTF-8"?>
    <Order>
               <OrderNumber>100001</OrderNumber>
               <Source>XYZ</Source>
               <OrderSublineNumber>7</OrderSublineNumber>
               <OrderSublineType>ADD</OrderSublineType>
               <OrderlineInstance>125</OrderlineInstance>
               <Lob>MOB</Lob>
                <Order>
               <OrderNumber>100001</OrderNumber>
               <Source>XYZ</Source>
               <OrderSublineNumber>7</OrderSublineNumber>
               <OrderSublineType>ADD</OrderSublineType>
               <OrderlineInstance>125</OrderlineInstance>
               <Lob>MOB</Lob>
                         <Order>
               <OrderNumber>100001</OrderNumber>
               <Source>XYZ</Source>
               <OrderSublineNumber>7</OrderSublineNumber>
               <OrderSublineType>ADD</OrderSublineType>
               <OrderlineInstance>125</OrderlineInstance>
               <Lob>MOB</Lob>
                        </Order>
               </Order>
    </Order>

我尝试实现的 Freemarker:

 <#macro test>
<ModifyRequest xmlns="http://soa.comptel.com/2011/02/instantlink">
      <RequestHeader>
       <NeType>BST</NeType>
      <OrderNo>$orderSubline.orderNo</OrderNo>
      <ReqUser>$orderSubline.source</ReqUser>
   </RequestHeader>
   <RequestParameters>
      <Parameter name="ACT_CODE1" value="$orderSubline.orderSublineNumber"/>
      <Parameter name="REQ_TYPE" value="$orderSubline.orderSublineType" />
      <Parameter name="ORDER_INSTANCE" value="$orderSubline.orderlineInstance" />
     <Parameter name="LOB" value="$orderSubline.lob"/>
   </RequestParameters>
  </ModifyRequest>
   </#macro>
  <@test/>

这给了我最后一个 &lt;ORDER&gt; 标签值,因为我需要迭代所有嵌套的 xml &lt;ORDER&gt; 标签。请建议我如何使用 freemarker 实现这一目标。

【问题讨论】:

【参考方案1】:

您的示例很奇怪,因为元素在 XML 中以大写字母开头,但在 FTL 中却没有。所以我不确定 XML 在那个项目中是如何暴露给 FreeMarker 的。无论如何,我想orderSubline 是数据模型(***变量)的一部分,并且对应于顶部Order 元素。您可以将Order 元素作为参数传递给宏,而不是从宏内部的数据模型中获取Order 元素。比如&lt;#macro test orderSubline&gt;,然后是&lt;@test orderSubline /&gt;。因此,在宏内部,宏可以为嵌套的Order 调用自身,例如:

<#if orderSubline.order[0]??>
  <@test orderSubline.order />
</#if>

【讨论】:

以上是关于使用freemarker的嵌套xml标签遍历的主要内容,如果未能解决你的问题,请参考以下文章

Freemarker的使用方法

java freemarker list嵌套

FreeMarker页面静态化入门

c#遍历嵌套层次很多的xml

Java 使用 freemarker 模板引擎的相关疑问 ,求大神走过路过不要错过

FreeMarker 集合遍历