2016-07-06 60 views
0

我正在处理定义一些元素的WSDL文件。事情是这样的:如何避免在具有相同SOAP头的WSDL操作中重复自己

<wsdl:operation name="MyOperationName"> 
    <soap:operation soapAction="http://www.domain.dk/myschema#MyService" style="document"/> 
    <wsdl:input name="MyServiceRequest"> 
      <soap:header use="literal" part="SecurityHeader" message="tns:SecurityHeader"/> 
      <soap:header use="literal" part="SomethingElseHeader" message="tns:SomethingElseHeader"/> 
      <soap:header use="literal" part="WhitelistingHeader" message="tns:WhitelistingHeader" wsdl:required="true"/> 
      <soap:body use="literal"/> 
    </wsdl:input> 
    <wsdl:output name="MyServiceResponse"> 
     <soap:body use="literal"/> 
    </wsdl:output> 
    <wsdl:fault name="MyFault"> 
     <soap:fault name="MyFault" use="literal"/> 
    </wsdl:fault> 
</wsdl:operation> 

我有很多WSDL操作的,他们都有着肥皂相同的同一列表:头元素:

  <soap:header use="literal" part="SecurityHeader" message="tns:SecurityHeader"/> 
      <soap:header use="literal" part="SomethingElseHeader" message="tns:SomethingElseHeader"/> 
      <soap:header use="literal" part="WhitelistingHeader" message="tns:WhitelistingHeader" wsdl:required="true"/> 

是否有某种方式来只有一次,然后定义此以某种方式将它“添加”到wsdl操作中作为某种参考?这样我只需要改变一个地方,如果标题改变或我需要添加一个新的标题。

我一直在试图扩展这样的wsdl:input元素(见下文),但我在这里xml/wsdl明智地说出了我的深度。但这说明了我在寻找什么。

<xs:complexType name="StandardHeaders"> 
    <xs:simpleContent> 
     <xs:extension base="wsdl:operation"> 
      <soap:header use="literal" part="SecurityHeader" message="tns:SecurityHeader"/> 
      <soap:header use="literal" part="SomethingElseHeader" message="tns:SomethingElseHeader"/> 
      <soap:header use="literal" part="WhitelistingHeader" message="tns:WhitelistingHeader" wsdl:required="true"/> 
     </xs:extension>xx 
    </xs:simpleContent> 
</xs:complexType> 
... 
<wsdl:input name="MyServiceRequest"> 
    <tns:StandardHeaders /> 

回答

0

好的,我一直在深入研究这个问题,并找到了适合我的解决方案。还有其他方法可以做到这一点,可能对其他方法有效,例如使用Axis2解析WSDL之外的其他内容,或者能够执行一些XSLT预处理,但是对于我而言,XML ENTITY定义是有效的。例如:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE definitions [ 
<!ENTITY myStandardSOAPRequestHeaders " 
      <soap:header use='literal' part='Header1Part' message='tns:header1' /> 
      <soap:header use='literal' part='Header2Part' message='tns:header2' /> 
"> 
<!ENTITY myStandardSOAPResponseHeaders " 
      <soap:header use='literal' part='RespHeader1' message='tns:resp1'/> 
      <soap:header use='literal' part='RespHeader2' message='tns:resp2'/> 
"> 
]> 
<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
       xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
.... 
&myStandardSOAPRequestHeaders; 

因此,基本上包含一个包含要重用的XML的ENTITY定义,然后使用&entityName引用该XML;

在我来说,我使用的内嵌实体定义哪些不是那么漂亮看(有属性值中的XML),但你可以参考外部文件,以及像这样:

<!ENTITY myHeader PUBLIC "path/to/external.xml"> 

有许多讨论这一点的有用网站。我发现这是有用的:

https://www.liquid-technologies.com/XML/EntityRefs.aspx

(我不与他们所属刚发现他们与谷歌)