不知道是否可能,但我会尽力解释。我遇到了一些代码,其中开箱即用的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>
答案 0 :(得分:1)
您将无法导入具有相同命名空间的相同元素的两个模式。如果必须更改架构,则必须对现有架构进行更改。