我正在尝试创建一个 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}
]
}
Xpath 应该是
.//ADDRESS/AddressLineText
示例代码中的一个问题是,在
<#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)。