Краткая версия:
Я пытаюсь написать XSD, который будет проверять мои ответы службы SOAP. Я вынужден просто импортировать http://schemas.xmlsoap.org/soap/envelope/вместо переопределения SOAP-элементов, таких как Envelope, Head и Body, но это определение схемы xmlsoap.org для Body слишком велико для моего использования - - как только я импортирую схему 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) с помощью Schema (второй фрагмент) с использованием функции PHP DOMDocument:: schemaValidateSource(), валидатор указал на мою первую очевидную ошибку:
Element 'soap: Envelope': нет доступной глобальной декларации
"Ой, ду, я подумал:" Эти элементы определены в пространстве имен SOAP, поэтому мне нужно импортировать SOAP XSD ".
Итак, я отредактировал свой 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 Schema должна быть причиной, по которой ответ проверяет эти две разные схемы. Схема 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, если возможно, использование существующих SOA XSD?
Здесь направление, которое я преследовал...
- Я предполагаю, что я мог бы выбросить xmlsoap.org XSD схему из окна и переопределить Envelope и Body самостоятельно, указав точно, что должно отображаться в элементе Body. Но я чувствую, что в конечном итоге у меня будет копия всех элементов мыла внутри моего собственного XSD, с немного другим определением Head and Body, и это похоже на нарушение DRY.
- Есть ли способ импортировать xmlsoap.org XSD, но затем переопределить определение soap: Body из моего XSD?