2014-01-13 17 views
1

不知道這是否可行,但我會盡力解釋我能做到的最好。我遇到了一些代碼,其中一個開箱即用的WSDL和XSD正在被修改,主要是爲了讓一個自定義的XSD與<types>分離並放置在他們自己的XSD中(而不是生活在<types>中)。由於某些原因,對某些類進行了小的更改以改變輸入/輸出對象類型。多個XSD重寫類

未來,如果WSDL有任何更新,有人必須手動進入並重新設置XSD以符合我們的需求,並且從已更新的WSDL版本中獲取新項目。

在SO上狩獵後,似乎可以將多個模式導入到WSDL的<types>定義中。我想知道這些XSD加載的順序,是否與它們在<types>中的排序有關?是否有可能「重寫」兩個XSD(原始模型和改裝模型)之間通用的類?

基本上我想拉出修改過的變化,並將它們放在自己的,非常輕量級的XSD中以減少佔位面積。一旦他們在自己的XSD中,任何新的WSDL更改(新版本等)都可以被拉入到「基本」XSD中,同時在「mod」XSD中具有小重寫類列表。這些類將具有相同的名稱空間和相同的類名稱。

什麼是正確的(是有可能)的方式做這樣的事情:

WSDL文件

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:tns="http://example.com/ExampleNamespace" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xmime="http://www.w3.org/2005/05/xmlmime" 
name="ExampleService" 
targetNamespace="http://example.com/ExampleNamespace"> 
<wsdl:types xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:schema> 
     <xsd:import schemaLocation="ORIGINAL.XSD" 
      namespace="http://example.com/ExampleNamespace" /> 
     <xsd:import schemaLocation="OVERRIDE.XSD" 
      namespace="http://example.com/ExampleNamespace" /> 
    </xsd:schema> 
</wsdl:types> 
....... 
</wsdl:definitions> 

ORIGINAL XSD

<xsd:schema xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:tns="http://example.com/ExampleNamespace" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" 
targetNamespace="http://example.com/ExampleNamespace"> 
<xsd:complexType name="ComplexTypeA"> 
    <xsd:sequence> 
     <xsd:element name="exampleElementOne" type="xsd:base64Binary" /> 
     <xsd:element name="exampleElementTwo" type="xsd:base64Binary" /> 
    </xsd:sequence> 
</xsd:complexType> 
... 
<xsd:complexType name="ComplexTypeN"> 
    ... 
</xsd:complexType> 
</xsd:schema> 

改寫XSD

<xsd:schema xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:tns="http://example.com/ExampleNamespace" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" 
targetNamespace="http://example.com/ExampleNamespace"> 
<!-- Override only ComplexTypeA --> 
<xsd:complexType name="ComplexTypeA"> 
    <xsd:sequence> 
     <xsd:element name="exampleElementOne" type="xsd:string" /> 
     <xsd:element name="exampleElementTwo" type="xsd:string" /> 
    </xsd:sequence> 
</xsd:complexType> 
</xsd:schema> 
+0

class在XSD中的位置?你能澄清嗎? – plkmthr

+0

當我的構建關閉時,我想使用Override.XSD中的定義將'ComplexTypeA'創建爲POJO,對於這兩種元素類型使用'string'。原始的或基本的XSD具有用'base64Binary'定義的'ComplexTypeA'作爲對象類型。我試圖找到一種更簡潔的方式來更新/定製這些類型中的一些,而不會有太多的開銷。 – Walls

回答

1

您將無法導入具有相同名稱空間的相同元素的兩個模式。如果您必須更改模式,則必須對現有模式進行更改。