2009-08-27 5 views
4

私は、WebアプリケーションとMicrosoft Exchange 2007との統合に取り組んでいます。Exchange Webサービス(EWS)を使用してExchange Serverと通信しています。しかし、私はWSDLに関するいくつかの問題に取り組んでいます。抽象型の要素を持つWSDLには、いくつかの型が定義されています。例:PHPで抽象型のWSDLを使用する

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

SearchExpressionはabtractタイプです。このようExistsTypeとしてSearchExpressionを拡張し、いくつかの種類があります。

<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クラスを使用して呼び出し、私は次のエラーが表示されます

The request failed schema validation: The element ' http://schemas.microsoft.com/exchange/services/2006/types:SearchExpression ' is abstract or its type is abstract.

私がフォローにRestrictionTypeタイプの定義を変更する場合、呼び出しは動作します:

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

PHPのSOAP処理がWSDLの抽象型を適切に処理できないか、またはWSDL自体に問題がある可能性がありますか? WSDLはローカルに格納されているので、必要が生じた場合は編集することができます。

ありがとうございます。

編集:
私はちょうど私がXMLを自分自身を形成しておりませんことを明確にしたかったのです。私は、適切なXMLを作成する必要がある次のコードを使用しています:

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

答えて

2

私は自分の質問に答えを見つけました。明らかに、PHPのSOAPオブジェクトは、抽象型がある場合に使用しているオブジェクト構造からXMLを適切に形成できません。この問題を解決するために、私はWSDLを編集し、任意の抽象型への参照を、それらを拡張する具体的な型への参照で置き換えました。上のRestrictionTypeの例では、次のようにスキーマ定義を変更しました:

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

私はこれが他の誰かを助けてくれることを願っています。少なくとも私のポストを読む時間を取ったすべての人に感謝します。

+0

は、私もそれをチェックアウトし、SoapVarが動作するようになった: '$のvarは=新しいSoapVar($データ、SOAP_ENC_ARRAY、 'RestrictionType'、 'のhttp:// thenamespace/Webサービス/名前空間')' –

1

FieldURI要素で追加のプロパティを追加しようとすると、非常に似た問題が発生します。それはとしてそれを作成しなければならないとき

<Path FieldURI='folder:DisplayName'> 

:としてPHPののSoapClientは、XMLを作成している側の注意点として、私は修正しようとする試みでプロキシクラスを作成するwsdl2phpを使用

<FieldURI FieldURI='folder:DisplayName'> 

問題だが、それは役に立たなかった。だから、私は現在、PHPのSoapClientがバグか、または wsdl2phpが間違ったプロキシクラスを作成した場合、WSDL交換の戻り値が間違っているかどうか疑問に思っています。誰かがこの問題に関する洞察を持っているなら、私たちに知らせてください。

+0

@Jake私は走りましたこの問題にも同様です。以下のソリューションを使用してtypes.xsdのPathへの参照を、それを拡張する型に置き換えることができました。私は私の現在のプロジェクトと一緒に行くようにExchangeでの作業をより簡単にするために図書館に取り組んでいます。私はすでにライブラリにソリューションを追加しました。それがあなたに役立つかどうかを調べることができます:http://code.google.com/p/php-ews/ – JamesArmes

+0

ありがとうございます。私は数日前に実際にあなたの図書館を見つけましたが、今はあなたが作者であることを認識しています。私は貴方の図書館を使わないことに決めました。なぜなら私はそれが何であったのかを知ることができず、少し違ったやり方を考えていたからです。しかし、積極的に取り組んでいるのであれば、私たちが協力し合うことは意味があります。 -Jake Levitt –

+0

あなたが協力していることについて誠実であれば、上記のプロジェクトへのリンクから私に連絡してください。 – JamesArmes

1

substitutionGroupは、タイプのないグローバル要素でのみ使用できます。

あなたが要素とないタイプが必要 REFリファレンスを使用する場合
<xs:element ref="t:SearchExpression"/> 

と同じ!代わりに、あなたがしたようのsubstitutionGroupを残す:

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

他approacheはただ抽象型とXMLスキーマインスタンス(タイプXSI)を使用することです。

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

これは、私が行ったように少し良いことを説明するかもしれません。 http://www.xfront.com/ExtensibleContentModels.pdf

+0

@ RededBaboonあなたの説明は理にかなっていますが、これは自分自身でXMLを形成する必要があります。 – JamesArmes

+0

XMLスキーマを変更する必要がある「自分自身でXMLを形成する」という意味ならば、そうです。 しかし、あなたはPHP Soap拡張を使用しています。クラスマップオプションを使用している場合、PHPのSoapClient/Serverクラスがこれを行います。 http://de2.php.net/manual/de/soapclient.soapclient.php – RedAssBaboon

関連する問題