遗留服务中重载元素的WSDL

时间:2011-05-18 13:04:29

标签: xml xsd wsdl

我正在尝试为遗留服务编写WSDL 1.1定义,其文档指定XML模式,该模式使不同消息的不同定义的根(和其他)元素重载。

一个简单的例子涉及一条消息的以下模式:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
  targetNamespace="urn:example:namespace">
    <element name="message" type="boolean"/>
</schema>

以及另一个:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
  targetNamespace="urn:example:namespace">
    <element name="message" type="date"/>
</schema>

因此,不能直接导入WSDL中给出的每个消息的模式,因为它引入了对{urn:example:namespace}message定义的歧义。

也不能重写模式,以便这些重载元素验证两种消息类型,因为这会错误地暗示任何一种类型对任一消息都有效:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
  targetNamespace="urn:example:namespace">
    <element name="message">
        <simpleType>
            <union memberTypes="boolean date"/>
        </simpleType>
    </element>
</schema>

让我觉得每个消息应该在它自己的命名空间中定义,或者在同一个命名空间中使用明确的元素名称。但是,这些变化会破坏传统的服务合同,因此可能不是一种选择。

感谢您对如何解决这一难题的想法和建议!

2 个答案:

答案 0 :(得分:0)

也许您不应该使用名为“message”的全局元素。如果'message'在anoither元素中,那么你可以使用这样的东西:

<xs:element name="m1">
   <xs:complexType>
        <xs:sequence>
           <xs:element name="message" type="data"/>
        </xs:sequence>
   </xs:complexType>
  </xs:element>

<xs:element name="m2">
   <xs:complexType>
        <xs:sequence>
           <xs:element name="message" type="boolean"/>
        </xs:sequence>
   </xs:complexType>
  </xs:element>

答案 1 :(得分:0)

Richard Schneideranswer促使我意识到我可以通过以下方式克服原始问题:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
  targetNamespace="urn:example:namespace">
    <complexType name="booleanMessageType">
        <xs:sequence>
            <element name="message" type="boolean"/>
        </xs:sequence>
    </complexType>
    <complexType name="dateMessageType">
        <xs:sequence>
            <element name="message" type="date"/>
        </xs:sequence>
    </complexType>
</schema>

然后是WSDL:

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
  xmlns:ns="urn:example:namespace"
  targetNamespace="urn:example:wsdl">
    <import namespace="urn:example:namespace" location="schema.xsd"/>
    <message name="BooleanMessage">
        <part name="body" type="ns:booleanMessageType"/>
    </message>
    <message name="DateMessage">
        <part name="body" type="ns:dateMessageType"/>
    </message>
    <!-- remainder of WSDL omitted for brevity -->
</definitions>

这引发了一个次要问题,我将在发布后将其作为评论链接。