无法使用 Freemarker 从 XML 读取重复的标签值

问题描述 投票:0回答:2

我正在尝试创建一个 Freemarker 程序来将 XML 转换为 JSON 。我无法从 xml 的重复标签的值列表中读取值。 我无法弄清楚为什么我无法从重复的标签中读取值。

<#assign DEALS = body[".//DEALS"]>
{
loans:  [
<#list DEALS as d>
    {
        <#assign PROPERTY = d[".//PROPERTY"]>
        propAddress1: ${PROPERTY[".//AddressLineText"]}
    }
</#list>
]

}

<MESSAGE>
<DEAL_SETS>
    <DEALS>
        <DEAL>
         <PROPERTY>
        <ADDRESS>
         <AddressLineText>1111</AddressLineText>
        </ADDRESS>
        </PROPERTY>
        </DEAL>
        <DEAL>
         <PROPERTY>
        <ADDRESS>
         <AddressLineText>2222</AddressLineText>
        </ADDRESS>
        </PROPERTY>
        </DEAL>
        <DEAL>
         <PROPERTY>
        <ADDRESS>
         <AddressLineText>3333</AddressLineText>
        </ADDRESS>
        </PROPERTY>
        </DEAL>
    </DEALS>
</DEAL_SET>
</MESSAGE>

Output
{
 "loans": []
}

Expected output
{
"loans": [
{propAddress1: 1111},
{propAddress1: 2222},
{propAddress1: 3333}
]
}
java json xml freemarker
2个回答
1
投票

Xpath 应该是

.//ADDRESS/AddressLineText


0
投票

示例代码中的一个问题是,在

<#list DEALS as d>
中,
DEALS
DEALS
元素的集合(您恰好有 1 个)。与 XSLT 中的逻辑相同。因此
d
将是
DEALS
元素,而不是
DEAL
元素,并且
DEALS
没有
PROPERTY
子元素。因此,您要列出的是
DEALS.DEAL
,它是(单个)
DEAL
元素内所有
DEALS
元素的集合。

我也不确定你为什么使用

//
。它有效,但通常你关心父母是什么,所以假设
body
对应于根元素(
MESSAGE
),也许只需使用这个:

{
  loans:  [
  <#list body.DEAL_SETS.DEALS.DEAL as DEAL>
    {
      propAddress1: ${DEAL.PROPERTY.ADDRESS.AddressLineText}
    }
  </#list>
  ]
}

(如果

body
确实是 XML 文档,那么当然你可以写
body.MESSAGES.DEAL_SETS.DEALS.DEAL
。)

此外,您可能想要引用地址,为此您可以使用顶部的

<#ftl output_format="JSON">
,然后使用
${DEAL.PROPERTY.ADDRESS.AddressLineText?c}
(这需要 FreeMarker 2.3.32)。

© www.soinside.com 2019 - 2024. All rights reserved.