使用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
相关产品推荐
相关产品推荐

