2016-05-26 15 views
6

ich diese Frage an anderer Stelle beantwortet gesehen habe, aber ich kann es immer noch nicht funktioniert, so dass ich brauche eine weitere Klarstellung:PHP Soapserver - Attribute in Knoten

Das Beispiel gegeben wurde:

$tag['_'] = 'yyy'; 
$tag['attr'] = 'xxx'; 
$tagVar = new SoapVar($tag, SOAP_ENC_OBJECT); 

die erzeugte xML wäre:

<tag attr="xxx">yyy</tag> 

aber ich bin immer

<tag> 
    <_>yyy</_> 
    <attr>xxx</attr> 
</tag> 

Ist also noch etwas nötig, damit es wie erwartet funktioniert? Irgendeine Art von Konfiguration in der SoapServer-Klasse oder in der WSDL?

Erschwerend Dinge ein bisschen mehr, das Element Namespace ist, also eigentlich für eine Art, wie ich bin auf der Suche

<ns:tag attr="xxx">yyy</ns:tag> 

Es erstaunt mich zu bekommen, wie schwer es ist, mit den Dingen zu tun bekommen sowohl SoapClient als auch SoapServer, und wie die meisten Fragen zum Thema hier auf SO und anderswo von der gleichen Person beantwortet werden, die sie gefragt hat, nachdem sie eine Art Hack oder merkwürdiges undokumentiertes Verhalten entwickelt haben, natürlich nach Stunden (Tagen) Kampf.

Antwort

2

Die PHP-Soap-Funktion ist so verrückt und ich habe nie herausgefunden, was darin so falsch war. Ich versuchte, Daten über die SOAP-API in zimbra zu verbinden und zu aktualisieren, und hatte viele Probleme. So habe ich SimpleXMLElement & Locken :)

Dort können Sie Ihre XML wie folgt aufbauen:

$xml = new SimpleXMLElement('<soap></soap>'); // create your base 

$xml = $xml->addChild('tag', str_replace('&', '&amp;', 'yyy')); // see addChild in docs 
$xml->attr = 'xxx'; // escaping content rather than addAttribute which does not 

echo $xml->asXML(); // which returns : <tag>yyy<attr>xxx</attr></tag> 

für den Namensraum gibt es einen Namensraum Argument in addChild, aber dies nicht ausgibt, was Sie wollen .. .

$xml = $xml->addChild('tag', str_replace('&', '&amp;', 'yyy'), 'ns'); 
$xml->attr = 'xxx'; 

echo $xml->asXML(); // which returns : <tag>yyy<attr>xxx</attr></tag> 

PS: wenn Sie in Browser ausgeführt wird, nicht zu htmlspecialchars die echos vergessen :)

+0

Ja, 'addAttribute' hilft. Ich habe auf eine Lösung auf höherer Ebene gehofft. – alepeino

+0

Sie meinen, Sie geben einer Funktion ein Array und lassen es das Zeug machen? – Bobot

+0

Dann können Sie FluidXML verwenden, um dies höher zu bekommen :) https://github.com/servo-php/fluidxml – Bobot

Verwandte Themen