You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Freemarker转换XML到JSON时,无法读取重复标签值

解决Freemarker读取XML重复标签列表为空的问题

我用Freemarker写XML转JSON的程序,但是读取XML里重复标签的列表值时失败,输出空数组,不知道问题出在哪。

我的Freemarker代码

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

待转换的XML内容

<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>

当前输出结果

{
 "loans": []
}

期望输出结果

{
"loans": [
{propAddress1: 1111},
{propAddress1: 2222},
{propAddress1: 3333}
]
}

问题原因及修正方案

1. XML标签拼写错误

XML中<DEAL_SETS>的结束标签写成了</DEAL_SET>(缺少末尾的S),这会导致XML解析失败,Freemarker无法正确识别节点结构。先修正该标签:

<!-- 修正后 -->
</DEAL_SETS>

2. XPath路径定位错误

当前代码遍历的是DEALS父容器节点,而实际需要遍历的是它下属的DEAL子节点。同时可以优化节点访问方式,让代码更简洁且精准:

修正后的Freemarker代码:

<#assign DEAL_LIST = body[".//DEALS/DEAL"]>
{
"loans":  [
<#list DEAL_LIST as deal>
    {
        "propAddress1": "${deal.PROPERTY.ADDRESS.AddressLineText}"
    }<#if deal_has_next>,</#if>
</#list>
]
}

修正说明:

  • 直接定位到DEALS下的DEAL节点列表:body[".//DEALS/DEAL"],确保拿到所有需要遍历的项
  • 使用.语法直接访问子节点,替代XPath全局搜索,更高效直观:deal.PROPERTY.ADDRESS.AddressLineText
  • 添加<#if deal_has_next>,</#if>处理JSON数组的逗号分隔,避免最后一项多逗号导致格式错误
  • 给JSON键值对添加引号,保证输出为标准JSON格式

内容的提问来源于stack exchange,提问作者VKP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:00:16