Я работаю над интеграцией нашего веб-приложения с Microsoft Exchange 2007. Я использую веб-службы Exchange (EWS) для связи с Exchange Server. Тем не менее, я сталкиваюсь с некоторыми проблемами с WSDL. В WSDL есть несколько типов, которые содержат элементы абстрактных типов. Например:
<xs:complexType name="RestrictionType">
<xs:sequence>
<xs:element ref="t:SearchExpression"/>
</xs:sequence>
</xs:complexType>
SearchExpression является типом абстракции. Существует несколько типов, расширяющих SearchExpression, например ExistsType:
<xs:complexType name="ExistsType">
<xs:complexContent>
<xs:extension base="t:SearchExpressionType">
...
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="Exists" type="t:ExistsType" substitutionGroup="t:SearchExpression"/>
Я ожидал бы, что смогу сделать правильный вызов, который выдаст следующий XML:
<Restriction>
<Exists>
...
</Exists>
</Restriction>
Однако, когда я пытаюсь сделать вызов, используя PHP-класс SoapClient, я получаю следующую ошибку:
Запрос не прошел проверку схемы: элемент 'http://schemas.microsoft.com/exchange/services/2006/types:SearchExpression' абстрактный или его тип абстрактный.
Если я изменю определение типа RestrictionType следующим образом, вызов сработает:
<xs:element name="Exists" type="t:ExistsType"/>
Не может ли обработка SOAP в PHP правильно обрабатывать абстрактные типы в WSDL, или же что-то не так с самим WSDL? WSDL хранится локально, поэтому я могу внести в него изменения, если возникнет такая необходимость.
Заранее благодарю за помощь.
Edit:
Я просто хотел уточнить, что я сам не формирую XML. Я использую следующий код, который должен создавать правильный XML:
$request->Restriction->IsGreaterThan->FieldURI->FieldURI =
'item:DateTimeReceived';
$request->Restriction->IsGreaterThan->FieldURIOrConstant
->Constant->Value = date('c', $last_checked_time);