Utilizzo di un WSDL con tipi astratti in PHP

Sto lavorando a un'integrazione tra la nostra applicazione Web e Microsoft Exchange 2007. Sto utilizzando Exchange Web Services (EWS) per comunicare con Exchange Server. Tuttavia, sto riscontrando alcuni problemi con il WSDL. Esistono diversi tipi definiti nel WSDL che contengono elementi di tipi astratti. Per esempio:

<xs:complexType name="RestrictionType"> <xs:sequence> <xs:element ref="t:SearchExpression"/> </xs:sequence> </xs:complexType> 

SearchExpression è un tipo di astrazione. Esistono diversi tipi che estendono SearchExpression come 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"/> 

Mi aspetterei di poter effettuare una chiamata valida che produca il seguente codice XML:

 <Restriction> <Exists> ... </Exists> </Restriction> 

Tuttavia, quando tento di effettuare la chiamata utilizzando la class SoapClient di PHP, ricevo il seguente errore:

La validation dello schema non rioutput: l'elemento " http://schemas.microsoft.com/exchange/services/2006/types:SearchExpression " è astratto o il suo tipo è astratto.

Se modifico la definizione del tipo RestrictionType al seguente, la chiamata funziona:

 <xs:element name="Exists" type="t:ExistsType"/> 

La gestione SOAP di PHP non è in grado di gestire correttamente i tipi astratti nel WSDL o potrebbe esserci qualcosa di sbagliato nel WSDL stesso? Il WSDL è memorizzato localmente, quindi posso apportre modifiche se necessario.

Grazie in anticipo per il tuo aiuto.

Modificare:
Volevo solo chiarire che non sto formando l'XML da solo. Sto usando il seguente codice che dovrebbe creare l'XML corretto:

 $request->Restriction->IsGreaterThan->FieldURI->FieldURI = 'item:DateTimeReceived'; $request->Restriction->IsGreaterThan->FieldURIOrConstant ->Constant->Value = date('c', $last_checked_time); 

Ho trovato la risposta alla mia domanda. Apparentemente l'object SOAP di PHP non può formare correttamente XML dalla struttura dell'object che sto usando quando ci sono tipi astratti. Per combattere il problema, ho modificato il WSDL e sostituito i riferimenti a tutti i tipi astratti con riferimenti ai tipi concreti che li estendono. Pertanto, per l'esempio RestrictionType di cui sopra, ho modificato la definizione dello schema in modo che corrispondesse a quanto segue:

 <xs:complexType name="RestrictionType"> <xs:choice maxOccurs ="unbounded"> <xs:element ref="t:Exists"/> <xs:element ref="t:Excludes"/> <xs:element ref="t:IsEqualTo"/> <xs:element ref="t:IsNotEqualTo"/> <xs:element ref="t:IsGreaterThan"/> <xs:element ref="t:IsGreaterThanOrEqualTo"/> <xs:element ref="t:IsLessThan"/> <xs:element ref="t:IsLessThanOrEqualTo"/> <xs:element ref="t:Not"/> <xs:element ref="t:And"/> <xs:element ref="t:Or"/> </xs:choice> </xs:complexType> 

Spero che questo aiuti qualcun altro a uscire. Grazie a tutti quelli che hanno avuto il tempo di leggere alless il mio post.

Puoi usare substitutionGroup solo con elementi globali non con tipi. Lo stesso con

 <xs:element ref="t:SearchExpression"/> 

se usi un riferimento ref hai bisogno di un elemento e non di un tipo!

 <xsd:complexType name="PublicationType"/> <xsd:element name="Publication" abstract="true" type="PublicationType"/> <xsd:element name="Book" substitutionGroup="Publication" type="BookType"/> <xsd:element name="Magazine" substitutionGroup="Publication" type="MagazineType"/> 

Un altro approache è solo per usare i tipi astratti e XMLSchema-instance (xsi: type) invece e lasciare il substitutionGroup come hai fatto tu.

 <xsd:complexType name="PublicationType" abstract="true"/> <xsd:element name="Publication" type="PublicationType"/> <xsd:element name="Book"type="BookType"/> <xsd:element name="Magazine" type="MagazineType"/> <Publication" xsi:type="MagazineType"> 

Questo potrebbe spiegare un po 'meglio come ho fatto io. http://www.xfront.com/ExtensibleContentModels.pdf

Sto avendo un problema molto simile cercando di aggiungere properties; aggiuntive con l'elemento FieldURI. Il SoapClient di PHP sta creando l'XML come:

 <Path FieldURI='folder:DisplayName'> 

quando dovrebbe essere creato come:

 <FieldURI FieldURI='folder:DisplayName'> 

Come nota a margine , ho usato wsdl2php per creare classi proxy nel tentativo di risolvere il problema, ma non è stato di aiuto. Quindi ora mi chiedo se il cambio di scambio WSDL è sbagliato, se il SoapClient di php è bacato, o se wsdl2php ha creato classi proxy errate. Se qualcuno ha qualche approfondimento su questo problema, faccelo sapere.