为何Freemarker模板无法解析带命名空间的XML?
解决FreeMarker解析带命名空间XML的问题
问题分析
原模板无法解析带默认命名空间的XML,核心问题在于XPath表达式定位不准确、命名空间下元素名称获取方式错误,以及JSON格式语法缺失。
修正后的模板
<#ftl ns_prefixes={"D": "http://www.test.org/"}> <#assign DEALS = body["/D:MESSAGE/D:DEALS[following-sibling::D:DOCUMENT_SETS]/D:DEAL"]> { "loans": [ <#list DEALS as d> { "${d["local-name(./*)"]}" : "${d["D:AddressLineText"]}" }<#if d_has_next>,</#if> </#list> ] }
修改说明
- 修正XPath定位:
将递归查找的路径改为从根节点直接定位,避免误匹配,确保只选中DOCUMENT_SETS同级且在前的DEALS节点。 - 获取正确元素名称:
使用local-name(./*)替代name(./*),获取不带命名空间前缀的元素本地名称,符合预期输出的键名要求。 - 修复JSON格式:
- 补全数组起始符
[,完善JSON结构 - 为键名添加双引号,符合JSON语法规范
- 用
<#if d_has_next>,</#if>处理元素间逗号,避免最后一项多余逗号
- 补全数组起始符
- 简化路径写法:
直接用D:AddressLineText定位子节点,路径更高效准确。
验证输出
使用提供的示例XML,修正后的模板将输出符合要求的JSON:
{ "loans": [ { "AddressLineText" : "Addr1" }, { "AddressLineText" : "Addr2" } ] }
内容的提问来源于stack exchange,提问作者VKP
相关产品推荐
相关产品推荐

