I am trying to use the PHP5 built-in Soap Client with a somewhat complex WSDL structure, as defined here: http://cmis.alfresco.com/cmis/NavigationService?wsdl
I defined all type classes and type mapping, and I can see a valid SOAP XML request and response within the __doRequest function. However, after __doRequest returns and PHP transforms the data into objects and arrays, I am missing all information that is returned as XML attributes and not as elements.
Here is the SOAP Request going out to the server:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns1="http://docs.oasis-open.org/ns/cmis/messaging/200908/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="http://docs.oasis-open.org/ns/cmis/ws/200908/"
xmlns:ns3="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<env:Header>
<ns3:Security env:mustUnderstand="true">
<Timestamp xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<Created>2012-08-02T17:16:11Z</Created>
<Expires>2012-08-02T18:16:11Z</Expires>
</Timestamp>
<ns3:UsernameToken><ns3:Username>***</ns3:Username>
<ns3:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">***</ns3:Password></ns3:UsernameToken>
</ns3:Security>
</env:Header>
<env:Body>
<ns1:getChildren xsi:type="ns2:getChildren">
<ns1:repositoryId>a8b08c6a-96e0-4783-a062-bc0ae106a2f2</ns1:repositoryId>
<ns1:folderId>workspace://SpacesStore/b461d5ac-5df9-48ec-84ed-03257c411227</ns1:folderId>
<ns1:filter>*</ns1:filter><ns1:orderBy/><ns1:includeAllowableActions/><ns1:includeRelationships/>
<ns1:renditionFilter/><ns1:includePathSegment/><ns1:maxItems/><ns1:skipCount/><ns1:extension/>
</ns1:getChildren>
</env:Body></env:Envelope>
Here is the SOAP Response coming back, shorted for repeating entries:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-1464665770">
<wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2012-08-01T15:16:19.407Z</wsu:Created>
<wsu:Expires xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2012-08-01T15:21:19.407Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</soap:Header>
<soap:Body>
<getChildrenResponse xmlns="http://docs.oasis-open.org/ns/cmis/messaging/200908/"
xmlns:ns2="http://docs.oasis-open.org/ns/cmis/core/200908/"
xmlns:ns3="http://www.alfresco.org">
<objects>
<objects>
<object>
<ns2:properties>
<ns2:propertyId propertyDefinitionId="cmis:objectTypeId">
<ns2:value>cmis:folder</ns2:value>
</ns2:propertyId>
<ns2:propertyString propertyDefinitionId="cmis:path">
<ns2:value>/Data Dictionary</ns2:value>
</ns2:propertyString>
<ns2:propertyString propertyDefinitionId="cmis:name">
<ns2:value>Data Dictionary</ns2:value>
</ns2:propertyString>
<ns2:propertyDateTime propertyDefinitionId="cmis:creationDate">
<ns2:value>2012-06-24T11:08:45.282+02:00</ns2:value>
</ns2:propertyDateTime>
<ns2:propertyString propertyDefinitionId="cmis:lastModifiedBy">
<ns2:value>System</ns2:value>
</ns2:propertyString>
<ns2:propertyString propertyDefinitionId="cmis:createdBy">
<ns2:value>System</ns2:value>
</ns2:propertyString>
<ns2:propertyId propertyDefinitionId="cmis:objectId">
<ns2:value>workspace://SpacesStore/14f3706f-a999-4e56-a19a-49c34db0fbe8</ns2:value>
</ns2:propertyId>
<ns2:propertyId propertyDefinitionId="cmis:baseTypeId">
<ns2:value>cmis:folder</ns2:value>
</ns2:propertyId>
<ns2:propertyDateTime propertyDefinitionId="cmis:lastModificationDate">
<ns2:value>2012-06-24T11:08:53.940+02:00</ns2:value>
</ns2:propertyDateTime>
<ns2:propertyId propertyDefinitionId="cmis:parentId">
<ns2:value>workspace://SpacesStore/b461d5ac-5df9-48ec-84ed-03257c411227</ns2:value>
</ns2:propertyId>
<ns3:aspects>
<ns3:appliedAspects>P:sys:localized</ns3:appliedAspects>
<ns3:appliedAspects>P:cm:titled</ns3:appliedAspects>
<ns3:appliedAspects>P:app:uifacets</ns3:appliedAspects>
<ns3:properties>
<ns2:propertyString propertyDefinitionId="cm:title">
<ns2:value>Data Dictionary</ns2:value>
</ns2:propertyString>
<ns2:propertyString propertyDefinitionId="cm:description">
<ns2:value>User managed definitions</ns2:value>
</ns2:propertyString>
<ns2:propertyString propertyDefinitionId="app:icon">
<ns2:value>space-icon-default</ns2:value>
</ns2:propertyString>
</ns3:properties>
</ns3:aspects>
</ns2:properties>
</object>
</objects>
...
<hasMoreItems>false</hasMoreItems>
<numItems>5</numItems>
</objects>
</getChildrenResponse>
</soap:Body>
</soap:Envelope>
A var_dump of the resulting object gives the following output. All the attribute data for propertyDefinitionId is completely lost:
array(5) {
[0]=>
object(cmisObjectInFolderType)#137 (3) {
["object"]=>
object(cmisObjectType)#136 (9) {
["properties"]=>
array(8) {
[0]=>
object(cmisPropertyString)#132 (5) {
["value"]=>
array(1) {
[0]=>
string(16) "/Data Dictionary"
}
["propertyDefinitionId"]=>
object(stdClass)#133 (0) {
}
["localName"]=>
NULL
["displayName"]=>
NULL
["queryName"]=>
NULL
}
[1]=>
object(cmisPropertyString)#140 (5) {
["value"]=>
array(1) {
[0]=>
string(15) "Data Dictionary"
}
["propertyDefinitionId"]=>
object(stdClass)#133 (0) {
}
["localName"]=>
NULL
["displayName"]=>
NULL
["queryName"]=>
NULL
}
[2]=>
object(cmisPropertyString)#141 (5) {
["value"]=>
array(1) {
[0]=>
string(6) "System"
}
["propertyDefinitionId"]=>
object(stdClass)#133 (0) {
}
["localName"]=>
NULL
["displayName"]=>
NULL
["queryName"]=>
NULL
}
[3]=>
object(cmisPropertyString)#142 (5) {
["value"]=>
array(1) {
[0]=>
string(6) "System"
}
["propertyDefinitionId"]=>
object(stdClass)#133 (0) {
}
["localName"]=>
NULL
["displayName"]=>
NULL
["queryName"]=>
NULL
}
[4]=>
object(cmisPropertyId)#143 (5) {
["value"]=>
array(1) {
[0]=>
string(11) "cmis:folder"
}
["propertyDefinitionId"]=>
object(stdClass)#133 (0) {
}
["localName"]=>
NULL
["displayName"]=>
NULL
["queryName"]=>
NULL
}
[5]=>
object(cmisPropertyId)#144 (5) {
["value"]=>
array(1) {
[0]=>
string(60) "workspace://SpacesStore/14f3706f-a999-4e56-a19a-49c34db0fbe8"
}
["propertyDefinitionId"]=>
object(stdClass)#133 (0) {
}
["localName"]=>
NULL
["displayName"]=>
NULL
["queryName"]=>
NULL
}
[6]=>
object(cmisPropertyId)#145 (5) {
["value"]=>
array(1) {
[0]=>
string(11) "cmis:folder"
}
["propertyDefinitionId"]=>
object(stdClass)#133 (0) {
}
["localName"]=>
NULL
["displayName"]=>
NULL
["queryName"]=>
NULL
}
[7]=>
object(cmisPropertyId)#146 (5) {
["value"]=>
array(1) {
[0]=>
string(60) "workspace://SpacesStore/b461d5ac-5df9-48ec-84ed-03257c411227"
}
["propertyDefinitionId"]=>
object(stdClass)#133 (0) {
}
["localName"]=>
NULL
["displayName"]=>
NULL
["queryName"]=>
NULL
}
}
["allowableActions"]=>
NULL
["relationship"]=>
NULL
["changeEventInfo"]=>
NULL
["acl"]=>
NULL
["exactACL"]=>
NULL
["policyIds"]=>
NULL
["rendition"]=>
NULL
["any"]=>
NULL
}
["pathSegment"]=>
NULL
["any"]=>
NULL
}
...
Obviously, I cannot change the WSDL file. I have read a few comments that PHP SOAP does not support attribute data in SOAP messages. If this is true, PHP SOAP is pretty much useless for this application.
Has anyone an idea how to parse the response with the built-in SOAP extension? Or do I need to go for a solution that bypasses the PHP SOAP functionality completely?