如何使用Java Smooks与Freemarker提取多命名空间XML元素
嘿,我之前在使用Smooks处理带多命名空间的XML转换时,也踩过类似的坑!结合你的输入XML,给你整理几个关键的解决步骤和配置示例,应该能帮你搞定问题:
处理Smooks多命名空间XML转换的核心要点
1. 先在Smooks配置中声明所有用到的命名空间
Smooks必须明确知道输入XML里的每个命名空间,才能正确解析节点。你需要在Smooks配置的根节点<smooks-resource-list>里声明soapenv和look这两个命名空间,示例如下:
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:look="http://www.example.com"> <!-- 后续的转换配置都写在这里 --> </smooks-resource-list>
2. 编写转换模板时必须带上命名空间前缀
不管你用FreeMarker模板还是Smooks的JavaBean映射,都要给目标节点加上对应的命名空间前缀,否则Smooks会找不到节点。
示例:用FreeMarker模板直接转换
假设你的转换模板文件是transform.tpl,内容要这样写(注意look:前缀):
<TransResponse> <Result>${look:Trans/Response}</Result> <SignValue>${look:Trans/DGX/SIGN}</SignValue> </TransResponse>
然后在Smooks配置里引用这个模板,指定作用在soapenv:Body节点上:
<resource-config selector="soapenv:Body"> <resource>org.milyn.delivery.DomModelCreator</resource> </resource-config> <resource-config selector="soapenv:Body"> <resource>org.milyn.delivery.template.FreeMarkerTemplate</resource> <param name="template">transform.tpl</param> </resource-config>
3. 用JavaBean映射的命名空间处理
如果你的流程是先把XML映射到JavaBean,再输出XML,那在<jb:bean>的selector属性里必须带上命名空间前缀:
<!-- 先映射look:Trans节点到Trans Bean --> <jb:bean beanId="transBean" class="com.yourpackage.Trans" selector="look:Trans"> <jb:property name="response" data="Response"/> <!-- 嵌套映射DGX节点 --> <jb:bean beanId="dgxBean" class="com.yourpackage.DGX" selector="DGX"> <jb:property name="sign" data="SIGN"/> </jb:bean> </jb:bean>
之后在模板里直接引用Bean的属性即可,不用再带命名空间:
<TransResponse> <Result>${transBean.response}</Result> <SignValue>${transBean.dgxBean.sign}</SignValue> </TransResponse>
4. 关键注意点
- 命名空间的URI必须和输入XML里的完全一致,哪怕一个字符、大小写差异都会导致Smooks识别失败;
- 如果输入XML里有默认命名空间(比如
xmlns="http://xxx"),也要在Smooks配置里给它绑定一个前缀(比如xmlns:ns="http://xxx"),然后用前缀引用节点。
内容的提问来源于stack exchange,提问作者keanu
相关产品推荐
相关产品推荐

