[英]Using a WSDL with abstract types in PHP
我正在开发Web应用程序和Microsoft Exchange 2007之间的集成。我正在使用Exchange Web服务(EWS)与Exchange Server进行通信。 但是,我遇到了WSDL的一些问题。 WSDL中定义了几种具有抽象类型元素的类型。 例如:
<xs:complexType name="RestrictionType">
<xs:sequence>
<xs:element ref="t:SearchExpression"/>
</xs:sequence>
</xs:complexType>
SearchExpression是一种abtract类型。 有几种类型可以扩展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"/>
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);
我找到了自己问题的答案。 显然,当有抽象类型时,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>
我希望这有助于其他人。 感谢所有花时间至少阅读我的帖子的人。
我尝试使用FieldURI元素添加其他属性时遇到了类似的问题。 PHP的SoapClient正在创建XML:
<Path FieldURI='folder:DisplayName'>
什么时候应该创建它:
<FieldURI FieldURI='folder:DisplayName'>
作为旁注,我使用wsdl2php来创建代理类以尝试解决问题,但它没有帮助。 所以我现在想知道WSDL交换返回是否错误,如果php的SoapClient是错误的,或者wsdl2php是否创建了错误的代理类。 如果有人对此问题有任何见解,请告诉我们。
您只能将substitutionGroup与不具有类型的全局元素一起使用。 同样的
<xs:element ref="t:SearchExpression"/>
如果你使用ref引用,你需要一个元素而不是一个类型!
<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"/>
另一个方法就是使用抽象类型和XMLSchema-instance(xsi:type),而不是像你一样离开substitutionGroup 。
<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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.