多个XSD覆盖类

时间:2014-01-13 18:46:00

标签: java web-services xsd wsdl

不知道是否可能,但我会尽力解释。我遇到了一些代码,其中开箱即用的WSDL和XSD正在被修改,主要是为了将<types>的自定义XSD剥离并放置在他们自己的XSD中(而不是生活在<types>中)。由于某种原因,对某些类进行了小的更改以更改输入/输出对象类型。

将来如果对WSDL有任何更新,有人必须手动进入并重新调整XSD以满足我们的需求,并从更新的WSDL版本中获取新项目。

在搜索SO之后,似乎可以将多个模式导入到WSDL的<types>定义中。我想知道这些XSD加载的顺序是否与它们在<types>中的排序有关?是否有可能“覆盖”两个XSD(原始XSD和修改过的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>

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

1 个答案:

答案 0 :(得分:1)

您将无法导入具有相同命名空间的相同元素的两个模式。如果必须更改架构,则必须对现有架构进行更改。