WSDL для перегруженных элементов в устаревшем сервисе - PullRequest
1 голос
/ 18 мая 2011

Я пытаюсь написать определение 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 голосов
/ 18 мая 2011

Ричард Шнайдер * ответ побудил меня понять, что я могу преодолеть первоначальный вопрос следующим образом:

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

Это породило вторичный вопрос, который я буду связывать в качестве комментария к этому ответу после публикации.

0 голосов
/ 18 мая 2011

Возможно, вам не следует использовать глобальный элемент с именем 'message'.Если '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>
...