2016-05-26 20 views
6

che ho visto questa domanda ha risposto altrove, ma ancora non riesco a farlo funzionare, quindi ho bisogno di qualche ulteriore precisazione:PHP SoapServer - attributi di nodi

L'esempio dato è stata:

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

l'XML generato sarebbe:

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

Tuttavia, mi sto

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

Quindi, è necessario qualcos'altro per farlo funzionare come previsto? Qualche tipo di configurazione nella classe SoapServer o anche nel WSDL?

A complicare le cose un po 'più, l'elemento viene namespace, quindi in realtà sto cercando un modo per ottenere

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

Mi stupisce come sia difficile fare le cose con sia SoapClient che SoapServer, e come la maggior parte delle domande sull'argomento qui su SO e altrove siano risolte dalla stessa persona che le ha poste, avendo escogitato una sorta di hack o strano comportamento non documentato, ovviamente dopo ore (giorni) di lotta.

risposta

2

Le funzioni di sapone PHP sono così pazze e non ho mai scoperto cosa ci fosse di così sbagliato. Stavo cercando di connettere e aggiornare i dati in zimbra tramite l'API SOAP e ho avuto molti problemi in merito. Così ho usato SimpleXMLElement & Curl :)

Ci si può costruire il XML in questo modo:

$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> 

Per lo spazio dei nomi, c'è un argomento namespace in addChild, ma questo non fa di output quello che vuoi .. .

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

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

PS: se si esegue in del browser, non dimenticate di htmlspecialchars l'eco :)

+0

Sì, 'addAttribute' aiuta. Speravo comunque in una soluzione di livello più alto. – alepeino

+0

Vuoi dire dare una matrice a una funzione e lasciarla fare la roba? – Bobot

+0

Quindi puoi usare FluidXML per ottenere questo più alto :) https://github.com/servo-php/fluidxml – Bobot

Problemi correlati