XML命名空间与FreeMarker模板协同使用问题求助
解决FreeMarker处理带默认命名空间XML的节点访问问题
当XML使用默认命名空间(xmlns="https://example.com/xyz")时,FreeMarker默认的节点查找逻辑不会自动关联这个命名空间,导致你原来的pp.doc.user1.name路径无法匹配到任何节点,最终返回空序列触发报错。
关键解决步骤
- 声明命名空间前缀映射
在FTL模板开头通过#ftl指令明确命名空间与前缀的映射:
<#ftl ns_prefixes={"ns": "https://example.com/xyz"}>
- 使用前缀访问所有命名空间下的节点
XML中所有未指定前缀的节点(包括根节点user1和子节点name)都属于默认命名空间,必须通过声明的前缀来访问:
${pp.doc.ns:user1.ns:name}
完整可运行示例
修改后的FTL模板:
<#ftl ns_prefixes={"ns": "https://example.com/xyz"}> ${pp.doc.ns:user1.ns:name}
对应带默认命名空间的XML:
<?xml version="1.0" encoding="UTF-8" ?> <user1 xmlns="https://example.com/xyz"> <name>Jack</name> </user1>
核心原因说明
FreeMarker处理XML时,不带前缀的节点查找仅匹配无命名空间的节点。当XML设置了默认命名空间后,所有未显式指定前缀的节点都会归入该命名空间,必须通过声明的前缀明确指定节点所属的命名空间,否则会被视为无命名空间节点,导致查找失败。
内容的提问来源于stack exchange,提问作者user3768495
相关产品推荐
相关产品推荐

