用于遗留服务中重载元素的 WSDL

发布于 2024-11-08 16:20:42 字数 1145 浏览 1 评论 0原文

我正在尝试为遗留服务编写 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>

令我印象深刻的是,每条消息应该在其自己的命名空间内定义,或者在同一命名空间内使用明确的元素名称。然而,此类更改会破坏旧服务合同,因此遗憾的是不是一种选择。

感谢您对如何(如果有的话)解决这一困境的想法和建议!

I am trying to write a WSDL 1.1 definition for a legacy service whose documentation specifies XML schema that overload root (and other) elements with different definitions for different messages.

A trivial example involves the following schema for one message:

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

and the following for another:

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

One cannot therefore directly import each message's schema as given into the WSDL, as it introduces ambiguity over the definition of {urn:example:namespace}message.

Nor can one rewrite the schema so that such overloaded elements validate both message types, as this would wrongly imply that either type is valid for either message:

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

It strikes me that each message should be defined within its own namespace, or else use unambiguous element names within the same namespace. However, such changes would break the legacy service contract and are therefore sadly not an option.

Grateful for your thoughts and suggestions on how, if at all, one can resolve this dilemma!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

趁年轻赶紧闹 2024-11-15 16:20:42

也许您不应该使用名为“message”的全局元素。如果“消息”位于另一个元素内,那么您可以使用如下内容:

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

Perhaps you should not be using a global element named 'message'. If 'message' is inside of anoither element then you could use something like this:

<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>
待天淡蓝洁白时 2024-11-15 16:20:42

理查德·施奈德答案促使我意识到我可以通过以下方式克服最初的问题:

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

这引起了第二个问题,一旦发布,我将把它作为评论链接到这个答案。

Richard Schneider's answer prompted me to realise that I can overcome the original question in the following way:

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

and then the 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>

This gave rise to a secondary question, which I will link as a comment to this answer once posted.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文