XML-serialisierung mit PEAR::SOAP - vermeiden von <item>s?
bepe
- php
Hallo,
Ich versuche (derzeit mit PEAR::SOAP) ein webservice aufzurufen, und habe dabei ein problem mit der parameterübergabe.
das web service erwartet folgende eingabe:
<order>
<product>
<name>...</name>
<id>...</id>
</product>
<product>
<name>...</name>
<id>...</id>
</product>
<product>
<name>...</name>
<id>...</id>
</product>
... usw.
</order>
Allerdings generiert mir PEAR::SOAP immer folgende Struktur:
<order>
<product>
<item>
<name>...</name>
<id>...</id>
</item>
<item>
<name>...</name>
<id>...</id>
</item>
<item>
<name>...</name>
<id>...</id>
</item>
... usw.
</product>
</order>
Wie bekomme ich die <item>'s weg? und erhalte dafür <product>'s?
Meine Variable wird folgendermassen gesetzt:
// für alle produkte
$msg['order']['product'][] = array( 'name' => '...' , 'id => '...' );
das problem tritt immer bei arrays mit assoziativem index auf, sobald unter einem index mehrere arrays/objekte gespeichert werden sollen.
wäre über eine lösung oder tips/tricks sehr dankbar - kann ja nicht sein dass man mit PHP nur solche web services nützen kann welche die verschrobene '<item>-logik' verstehen können.
lg bernhard
echo $begrüßung;
Ich wage mit meiner geringen PEAR::SOAP-Erfahrung mal zu antworten.
Wie bekomme ich die <item>'s weg? und erhalte dafür <product>'s?
Meine Variable wird folgendermassen gesetzt:
// für alle produkte
$msg['order']['product'][] = array( 'name' => '...' , 'id => '...' );
So wie es aussieht lässt du den eingebauten Serializer die Arbeit tun. Wenn ich das Problem hätte, würde ich als nächstes probieren, die Daten mit SOAP_Value-Objekten selbst zusammenzuschachteln.
echo "$verabschiedung $name";
hallo dedlfix
Ich wage mit meiner geringen PEAR::SOAP-Erfahrung mal zu antworten.
Was verwendest du? NuSoap? ich bin bzgl. SOAP bibliothek offen für alles/neues.
So wie es aussieht lässt du den eingebauten Serializer die Arbeit tun.
So ist es. Wusste nicht dass man den irgendwie austricksen könnte?!
Wenn ich das Problem hätte, würde ich als nächstes probieren, die Daten mit SOAP_Value-Objekten selbst zusammenzuschachteln.
Naja, aber wie konkret? Wenn ich Array-Felder als SOAP_Value definiere, dann steht halt der datentyp im <name> element dabei. allerdings werden <name> und <id> immer noch in items gestopft.
Ich müsste der SOAP Library irgendwie sagen können dass er numerische kinder-zweige in einem assoziativen array durch gleichnamige XML-siblings ausdrücken soll (anstatt durch generische items).
Array
(
[product] => Array
(
[0] => Array
(
[name] => ...
[id] => ...
)
[1] => Array
(
...
)
)
)
welchen SOAP_Value müsste ich dann für $products setzen damit am ende die gewünschte XML struktur rauskommt?
// fill up all products in $poducts
$msg['order'] = new SOAP_Value('product','????',$products)
aber selbst dann wären die $products numerisch indiziert und er würde wieder anfangen 'items' zu produzieren oder?
Durch recherchen im google bin ich nicht sehr schlau geworden bisher zum thema serialisierung komplexer variablen-strukturen in PHP
lg bernhard
echo $begrüßung;
Ich wage mit meiner geringen PEAR::SOAP-Erfahrung mal zu antworten.
Was verwendest du? NuSoap? ich bin bzgl. SOAP bibliothek offen für alles/neues.
Gar keins. Bei meinen Versuchen blieb ich aber bei PEAR::SOAP hängen. Das schien mir das umfangreichste zu sein. Bei den anderen fehlte immer irgendwas.
Ich müsste der SOAP Library irgendwie sagen können dass er numerische kinder-zweige in einem assoziativen array durch gleichnamige XML-siblings ausdrücken soll (anstatt durch generische items).
Verwende kein Array sondern packe deine Werte einzeln in SOAP_Values und die wiederum in ein SOAP_Value vom Typ SOAPStruct (oder was anderes passendes) und so schachteslt du dir selbst deine Struktur zusammen. Schau dir mal das Beispiel example_types.php im Verzeichnis docs/SOAP/example an.
In Base.php gibt es eine Methode SOAP_Base::_serializeValue(). Dort wird für Arrays in einer foreach-Schleife dein item erzeugt, wenn die Elemente keine SOAP_Values sind. Die sieht verkürzt so aus:
foreach ($value as $array_val)
if ($this->_isSoapValue($array_val))
$xmlout_value .= $this->_serializeValue($array_val, $array_val->name, ...);
else
$xmlout_value .= $this->_serializeValue($array_val, 'item', ...);
Also, verwende SOAP_Values statt nativer PHP-Variablen und alles wird gut ...
echo "$verabschiedung $name";
hallo dedlfix
Ich wage mit meiner geringen PEAR::SOAP-Erfahrung mal zu antworten.
Was verwendest du? NuSoap? ich bin bzgl. SOAP bibliothek offen für alles/neues.
Gar keins. Bei meinen Versuchen blieb ich aber bei PEAR::SOAP hängen. Das schien mir das umfangreichste zu sein. Bei den anderen fehlte immer irgendwas.
soll heissen du strickst deine sockets selbst? ;-)
Verwende kein Array sondern packe deine Werte einzeln in SOAP_Values und die wiederum in ein SOAP_Value vom Typ SOAPStruct (oder was anderes passendes) und so schachteslt du dir selbst deine Struktur zusammen. Schau dir mal das Beispiel example_types.php im Verzeichnis docs/SOAP/example an.
Das klingt schonmal sehr gut!! danke! in meiner install gibts kein examples directory, habs mir jetzt aber händisch runter geladen, und werd gleich mal stöbern.
die doku auf der pear.php.net site finde ich jedenfalls nicht sehr hilfreich :-(
Also, verwende SOAP_Values statt nativer PHP-Variablen und alles wird gut ...
Ich werd das definitiv gleich ausprobieren! :-) Danke für deine Tips!
lg bernhard