[PHP] SOAP mit WSDL

Graccem

* {display:none;}
ID: 178362
L
4 Juni 2006
324
29
Hallo,

ich habe ein Problem mit SOAP. Ich möchte einen Webservice aufsetzen, der die FAQ zurückgibt. Für diese Aufgabe habe ich folgendes Schema für die WSDL entworfen.

Code:
<xs:element name="getFaqOut">
	<xs:complexType>
		<xs:sequence>
			<xs:element name="response" type="tns:faqOutput"/>
		</xs:sequence>
	</xs:complexType>
</xs:element>
<xs:complexType name="faqOutput">
	<xs:sequence>
		<xs:element name="faq" type="tns:faqSchema" maxOccurs="unbounded"/>
		<xs:element name="since" type="xs:string"/>
	</xs:sequence>
</xs:complexType>
<xs:complexType name="faqSchema">
	<xs:sequence>
		<xs:element name="headline" type="xs:string"/>
		<xs:element name="faqQuestion" type="tns:faqQuestionSchema" maxOccurs="unbounded"/>
	</xs:sequence>
</xs:complexType>
<xs:complexType name="faqQuestionSchema">
	<xs:sequence>
		<xs:element name="question" type="xs:string"/>
			<xs:element name="answer" type="xs:string"/>
	</xs:sequence>
</xs:complexType>

Wenn ich die FAQ aus der DB auslese, baue ich diese mittels SimpleXMLElement auf. asXML() gibt mit dann auch wunderbar das erwartete XML zurück. Dieses sieht auch so aus, wie das XML, dass XMLSpy anhand der WSDL generiert.

Doch wenn ich dieses SimpleXMLElement-Objekt dann an den Webservice übergebe, bleibt leider nur noch ein Datensatz (der erste) übrig. Die Rückgabe des Webservice sieht wie folgt aus.

Code:
<SOAP-ENV:Envelope>
	<SOAP-ENV:Body>
		<ns1:getFaqOut>
			<ns1:response>
				<ns1:faq>
					<ns1:headline>FOOBAR 1</ns1:headline>
					<ns1:faqQuestion>
						<ns1:question>FOO 1</ns1:question>
						<ns1:answer>BAR 1</ns1:answer>
					</ns1:faqQuestion>
				</ns1:faq>
				<ns1:since>NOW</ns1:since>
			</ns1:response>
		</ns1:getFaqOut>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Erwarten tue ich aber


Code:
<SOAP-ENV:Envelope>
	<SOAP-ENV:Body>
		<ns1:getFaqOut>
			<ns1:response>
				<ns1:faq>
					<ns1:headline>FOOBAR 1</ns1:headline>
					<ns1:faqQuestion>
						<ns1:question>FOO 1</ns1:question>
						<ns1:answer>BAR 1</ns1:answer>
					</ns1:faqQuestion>
					<ns1:faqQuestion>
						<ns1:question>FOO 2</ns1:question>
						<ns1:answer>BAR 2</ns1:answer>
					</ns1:faqQuestion>
				</ns1:faq>
				<ns1:faq>
					<ns1:headline>FOOBAR 3</ns1:headline>
					<ns1:faqQuestion>
						<ns1:question>FOO 3</ns1:question>
						<ns1:answer>BAR 3</ns1:answer>
					</ns1:faqQuestion>
					<ns1:faqQuestion>
						<ns1:question>FOO 4</ns1:question>
						<ns1:answer>BAR 4</ns1:answer>
					</ns1:faqQuestion>
				</ns1:faq>
				<ns1:since>NOW</ns1:since>
			</ns1:response>
		</ns1:getFaqOut>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Wo liegt mein (Denk-)Fehler? Für mich sieht es derzeit so aus, als würde maxOccurs="unbounded" keine Wirkung zeigen.

Als SOAP-Server verwende ich den von PHP selber (SoapServer). Der Server an sich funktioniert auch, da ich bereits andere Dinge damit realisiert habe.
 
ich kann nur empfehlen Zend_Soap zu verwenden ;)
Man muss selbst kein WSDL definieren, dass macht die Klasse selbst aus den Methoden, die du ihr übergibst, eine sehr feine Sache.
Generell erzeugt man eigentlich kaum noch WSDLs selbst, in jeder Sprache ist das doch mitlerweile automatisiert.