【问题标题】:How to extract elements from xml having multiple namespaces using java smooks and freemarker如何使用 java smooks 和 freemarker 从具有多个命名空间的 xml 中提取元素
【发布时间】:2018-09-01 11:43:52
【问题描述】:

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

这是我的示例输入文件

<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 配置文件

<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>

我怎样才能做到这一点?

【问题讨论】:

    标签: java freemarker smooks


    【解决方案1】:

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

    模板:

    <#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}
    

    数据模型:

    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>
    

    结果:

    123
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      相关资源
      最近更新 更多