【问题标题】:ESB Proxy XML Request inside CDATA tag in SOAP requestSOAP 请求中 CDATA 标记内的 ESB 代理 XML 请求
【发布时间】:2019-05-15 02:33:23
【问题描述】:

我是 Apache Synapse 的新手。我需要对 SOAP 服务进行基于内容的路由和代理。但是,实际请求是 SOAP 请求正文中 CDATA 标记内的 XML 文档。在基于此文档的内容进行路由之后,我需要使用 XQuery 中介器来转换文档并调用代理服务。我无法更改此请求的 WSDL。是否可以对 CDATA 标签内的文档进行路由和转换?当我从 Synapse 中记录请求时,我看到 CDATA 中的 XML 已被转义。我看过一些描述保留 CDATA 的帖子,但我不确定在这两种情况下我能用它做什么。

请求如下所示。我需要根据TypeOfRequest 属性来路由消息:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:svc="http://integration.myservice.com">
   <soapenv:Header/>
   <soapenv:Body>
      <svc:Execute>
         <svc:myservice>
             <![CDATA[
             <?xml version="1.0" encoding="UTF-8"?>
            <myservice xmlns="http://integration.myservice.com">
                <Request TypeOfRequest="type1" RequestID="1" Echo="false">
                    <Message>
                        <Tag1510>
                            <TypeCode>10</TypeCode>
                            <SubTypeCode>00</SubTypeCode>
                        </Tag1510>
                        <Tag2000>
                            <Amount>
                                <Amount>1.00</Amount>
                            </Amount>
                        </Tag2000>
                    </Message>
                </Request>
            </myservice>
            ]]>
        </svc:myservice>
      </svc:Execute>
   </soapenv:Body>
</soapenv:Envelope> 

【问题讨论】:

    标签: wso2 wso2esb synapse


    【解决方案1】:

    通常您可以使用 xslt 删除 CDATA 块。在这种情况下,&lt;?xml ..?&gt; 会造成麻烦,但我想我设法使用substring 解决了这个问题,但无法对此进行测试(编辑:但它根据下面的反馈工作) https://xsltfiddle.liberty-development.net/pPqsHUz/1

    另一种方法是使用脚本中介器在 javascript 中执行一些 stringmagic 以提取 myservice 和 /myservice 之间的部分

    编辑:我在下面添加了 XSLT,以防 xsltfiddle 链接停止工作:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="2.0" xmlns:svc="http://integration.myservice.com"
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    
      <!-- match all elements that are not 'svc:myservice' and ignore -->
      <xsl:template match="@* | node()">
            <xsl:apply-templates select="@* | node()"/>
      </xsl:template>
    
      <!-- match svc:myservice and copy the entire CDATA string after the ?xml line -->
      <xsl:template match="svc:myservice">
         <xsl:copy>
           <xsl:value-of select="substring-after(., '?>')" disable-output-escaping="yes"/>
         </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 这解决了这个问题。我能够使用 xslt 调解器来提取文档。在这一步之后,我能够进行路由和转换。
    • 太棒了!感谢您的反馈!
    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多