用于遗留服务中重载元素的 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>
令我印象深刻的是,每条消息应该在其自己的命名空间内定义,或者在同一命名空间内使用明确的元素名称。然而,此类更改会破坏旧服务合同,因此遗憾的是不是一种选择。
感谢您对如何(如果有的话)解决这一困境的想法和建议!
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
也许您不应该使用名为“message”的全局元素。如果“消息”位于另一个元素内,那么您可以使用如下内容:
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:
理查德·施奈德的答案促使我意识到我可以通过以下方式克服最初的问题:
然后是 WSDL:
这引起了第二个问题,一旦发布,我将把它作为评论链接到这个答案。
Richard Schneider's answer prompted me to realise that I can overcome the original question in the following way:
and then the WSDL:
This gave rise to a secondary question, which I will link as a comment to this answer once posted.