Hi Bruchpilot,
danke für Deine Antwort. Zur WSDL. Das schliessende Schema-Element ist mir beim Kopieren wohl durchgerutscht. Wollte nicht die ellenlange Datei posten sonder nur eine exemplarische Funktion. Die Datei scheint so aber zu funktionieren. Zumindest beim PHP und auch bei JAVA Axis wird sie ohne Fehler geparsed. Habe auch Deine Datei probiert. Meine PHP-Server-Funktion gibt mir hier ebenfalls ein Ergebnis zurück. Wenn dies auch etwas anders als das, was über meine WSDL-Datei ausgegeben wird.
Das Problem ist aber eigentlich nicht die WSDL-Datei, sondern die Funktion die die SOAP-XML-Response erzeugt.
Ich habe jetzt einen Weg gefunden um die Response entsprechend der Schema-Definition zu erzeugen. Man muss Klassen und die entspr. Objekte erzeugen und diese dann entsprechend der WSDL-Struktur ineinander verschachteln. Die einzelnen Objekte werden dann zusätlich in SoapVars gepackt und mit deren Hilfe die XML-Elemente modifiziert.
Hier die WSDL-Type Definition für meine Beispielfunktion:
Code:
<xsd:complexType name="AllSiteList">
<xsd:all>
<xsd:element name="AllSiteListElements" type="tns:AllSiteListElementArray" />
</xsd:all>
</xsd:complexType>
<xsd:complexType name="AllSiteListElementArray">
<xsd:complexContent>
<xsd:restriction base="soapenc:Array">
<xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="tns:AllSiteListElement[]" />
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="AllSiteListElement">
<xsd:all>
<xsd:element name="idSite" type="tns:idSite" />
<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="idSite">
<xsd:attribute name="oid" type="int" use="required"></xsd:attribute>
</xsd:complexType>
Hier die php Funktion die die WSDL-Konforme Response zurückgibt:
Code:
<?php
class AllSiteListElement {
public $name;
public $idSite;
}
class AllSiteList{
public $AllSiteListElements;
}
class idSite{
public $oid;
}
##################################################################################
function getAllSites() {
##################################################################################
$sql = "SELECT idSite, name FROM site ORDER BY idSite";
$result_db = get_mysql_result($sql);
if (!$result_db) {
return new SoapFault('SERVER', mysql_error(), 'getAllShopSites', '');
}
if(mysql_num_rows($result_db) == 0) {
return new SoapFault('Client', 'empty resultset', 'getAllSites', '');
}
else {
$AllSiteList = new AllSiteList();
while($row = mysql_fetch_assoc($result_db)){
$element = new AllSiteListElement();
$OidSite = new idSite();
$OidSite->oid = new SoapVar($row[idSite], XSD_INT, '','','idSite');
$element->idSite = new SoapVar($OidSite, SOAP_ENC_OBJECT, 'oid','','idSite');
$element->name = new SoapVar($row[name], XSD_STRING, '','','name');
$AllSiteList->AllSiteListElements[] = new SoapVar($element, SOAP_ENC_OBJECT, 'AllSiteListElement','','AllSiteListElement');
}
mysql_close();
return new SoapVar($AllSiteList, SOAP_ENC_OBJECT,'AllSiteList');
}
}
Das erzeugte Response-XML ist zumindest von php5 sowie Java (Apache Axis) verwertbar.
Ich hoffe das hilft vielleicht dem Einen oder Anderen weiter und erspart einiges an Kopfzerbrechen und Rätselraten.
Viele Grüße
Micha