2016-07-06 46 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

(我不與他們所屬剛發現他們與谷歌)

相關問題