Короткая версия:
Я пытаюсь написать XSD, который проверит ответы моей службы SOAP.Я чувствую себя обязанным просто импортировать http: // schemas.xmlsoap.org/soap/envelope/ вместо переопределения элементов SOAP, таких как Envelope, Head и Body, но это определение схемы Body для xmlsoap.org слишком широкое для моего использования.- как только я импортирую схему SOAP, внезапно мой XSD (который я тщательно настроил для своей службы) проверяет все сообщения SOAP.
Как мне определить определение конверта SOAP, головы, тела в моем XSD?
Я подозреваю, что проблема заключается в том, что я пытаюсь повторно использоватьдругие схемы, которые я не должен пытаться использовать повторно.Конечно, эти схемы для SOAP предназначены для определения того, как (все) сообщения SOAP должны выглядеть.И, может быть, мне просто нужно определить в своей схеме, как я хочу, чтобы мое конкретное тело мыла выглядело.
Возможно, я только что ответил на свой вопрос.Может быть, у кого-то есть другое решение?
Длинная версия:
У меня небольшие проблемы с созданием XSD для описания ответного сообщения от одной из моих служб SOAP.
Вотпример ответа от моей службы, который я пытаюсь проверить:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<helloResponse xmlns="http://justinfaulkner/wsdl/1.0">
<Message>Hello, Justin!</Message>
<Message>Your lucky numbers are: 329, 9</Message>
</helloResponse>
</soap:Body>
</soap:Envelope>
Моя цель - проверить ответы от моей службы с помощью XSD.Итак, я вручную создал XSD, который описывает все типы, которые принадлежат мылу моей службы: Body
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://justinfaulkner/wsdl/1.0" xmlns:tns="http://justinfaulkner/wsdl/1.0">
<xsd:complexType name="helloResponseType">
<xsd:sequence>
<xsd:element name="Message" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="helloResponse" type="tns:helloResponseType"/>
</xsd:schema>
Когда я попытался проверить пример ответа (первый фрагмент XML) с помощью схемы (второй фрагмент)используя функцию PHP DOMDocument :: schemaValidateSource (), валидатор указал на мою первую очевидную ошибку:
Элемент 'soap: Envelope': нет подходящего глобального объявления
"Ой, да, - подумал я, - эти элементы определены в пространстве имен SOAP, поэтому мне нужно импортировать XSD SOAP. "
Поэтому я отредактировал свой XSD и добавил импорт:
<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
И это сработало!DOMDocument :: schemaValidateSource возвращает true, когда я проверяю мыльный ответ с помощью XSD.
Затем, в качестве проверки работоспособности , я взял другой XSD-ответ мыльного ответа, который у меня лежал:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://justinfaulkner/wsdl/1.0" xmlns:tns="http://justinfaulkner/wsdl/1.0">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
<xsd:complexType name="OtherServiceResponseType">
<xsd:all>
<xsd:element name="CompletionCode" type="xsd:string"/>
<xsd:element name="ResponseMessage" type="xsd:string"/>
</xsd:all>
</xsd:complexType>
<xsd:element name="OtherServiceResponse" type="tns:OtherServiceResponseType"/>
</xsd:schema>
И я попытался подтвердить мой мыльный ответ с помощью этой совершенно не связанной схемы ...
И схема, которая, на первый взгляд, вообще не описывает это сообщение, такжепроверяет мыльный ответ.
Затем я понимаю, что Схема XSD должна быть причиной, по которой ответ проверяет эти две разные схемы.Схема SOAP, которую я импортирую из http://schemas.xmlsoap.org/soap/envelope/, определяет элемент Body следующим образом:
<xs:element name="Body" type="tns:Body" />
<xs:complexType name="Body" >
<xs:sequence>
<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</xs:sequence>
<xs:anyAttribute namespace="##any" processContents="lax" >
<xs:annotation>
<xs:documentation>
Prose in the spec does not specify that attributes are allowed on the Body element
</xs:documentation>
</xs:annotation>
</xs:anyAttribute>
</xs:complexType>
, что позволяет содержимому тега Body быть практически любым.
ТоИмеет смысл, цель XSD XSD - определить, как должны выглядеть ВСЕ XSD, а не только мои.
Итак, мой вопрос: как должен построить XSD для проверки этих SOAP-ответов, используя, если возможно, существующие XAP-SOAP?
ВотНаправление, которое я преследовал ...
- Полагаю, я мог бы выбросить XSD-схему xmlsoap.org в окно и переопределить Envelope и Body самостоятельно, точно указав, что должно отображаться в элементе Body.Но я чувствую, что в итоге у меня будет копия всех мыльных элементов в моем собственном XSD с немного другим определением головы и тела, и это похоже на нарушение DRY.
- Есть ликак я могу импортировать XSD из xmlsoap.org, но затем переопределить определение soap: Body из моего XSD?