首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用java smooks和freemarker从具有多个名称空间的xml中提取元素

如何使用java smooks和freemarker从具有多个名称空间的xml中提取元素
EN

Stack Overflow用户
提问于 2018-03-23 05:28:39
回答 1查看 248关注 0票数 0

我正在尝试使用Smooks进行XML-XML转换。当输入XML有多个命名空间时会遇到问题。

这是我的示例输入文件

代码语言:javascript
复制
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header/>
  <soapenv:Body>
    <look:Trans xmlns:look="http://www.example.com">
     <Response>0</Response>
     <DGX>
       <SIGN>1</SIGN>
     </DGX> 
   </look:Trans>
  </soapenv:Body>
</soapenv:Envelope>

和我的smooks配置文件

代码语言:javascript
复制
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
 xmlns:core="http://www.milyn.org/xsd/smooks/smooks-core-1.4.xsd"
 xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd">

<params>
    <param name="stream.filter.type">SAX</param>
    <param name="default.serialization.on">false</param>
</params>

<resource-config selector="Trans">
    <resource>org.milyn.delivery.DomModelCreator</resource>
</resource-config>

<ftl:freemarker applyOnElement="Trans">
    <ftl:template>
<!--  <#ftl ns_prefixes={"look": "http://www.example.com"}> <#outputformat 'XML'> 
<Response> 
    <Code>${look\:Trans.Response} </Code>
    <Sign>${look\:Trans.DGX.SIGN} </Sign>
</Response> </#outputformat> -->
    </ftl:template>

我怎么才能让它工作呢?

EN

回答 1

Stack Overflow用户

发布于 2018-03-23 07:10:33

我不确定Smooks选择哪个XML节点作为模板上下文根...如果是soapenv:Body,那么我看不出你的模板有什么问题。无论如何,我已经在http://try.freemarker.org/上尝试了这一点,其中doc是文档节点(所以这对Smooks来说是不同的),以证明多个名称空间应该像这样工作:

模板:

代码语言:javascript
复制
<#ftl ns_prefixes={"look": "http://www.example.com", "soapenv": "http://schemas.xmlsoap.org/soap/envelope/"}
      output_format="XML">
${doc.soapenv\:Envelope.soapenv\:Body.look\:Trans.DGX.SIGN}

数据模型:

代码语言:javascript
复制
doc=
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header/>
  <soapenv:Body>
    <look:Trans xmlns:look="http://www.example.com">
     <Response>0</Response>
     <DGX>
       <SIGN>123</SIGN>
     </DGX> 
   </look:Trans>
  </soapenv:Body>
</soapenv:Envelope>

结果:

代码语言:javascript
复制
123

顺便说一句,请注意,您可以将output_format='XML'添加到<#ftl ...>中,而不是添加<#outputformat 'XML'>...</#outputformat>。它更短。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49438789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档