PHP SoapServer - 节点中的属性

ale*_*ino 6 php xml soap wsdl

我已经看到这个问题在其他地方得到了解答,但我仍然无法使其成功,所以我需要进一步澄清:

给出的例子是:

$tag['_'] = 'yyy'; 
$tag['attr'] = 'xxx'; 
$tagVar = new SoapVar($tag, SOAP_ENC_OBJECT);
Run Code Online (Sandbox Code Playgroud)

生成的xml将是:

<tag attr="xxx">yyy</tag>
Run Code Online (Sandbox Code Playgroud)

但是,我得到了

<tag>
  <_>yyy</_>
  <attr>xxx</attr>
</tag>
Run Code Online (Sandbox Code Playgroud)

那么,还有什么需要让它按预期工作吗?甚至在SoapServer类或WSDL中的某种配置?

为了使事情复杂化,元素是命名空间,所以实际上我正在寻找一种方法

<ns:tag attr="xxx">yyy</ns:tag>
Run Code Online (Sandbox Code Playgroud)

让我感到惊讶的是,使用SoapClient和SoapServer完成工作是多么困难,以及SO和其他地方关于这个主题的大多数问题如何由提出问题的同一个人回答,提出某种黑客或奇怪的无证行为,当然是经过数小时(天)的斗争.

Bob*_*bot 2

PHP的soap函数太疯狂了,我从来没有发现它出了什么问题。我试图通过 SOAP API 连接并更新数据到 zimbra,但遇到了很多问题。所以我使用了 SimpleXMLElement 和 Curl :)

在那里你可以像这样构建你的 XML:

$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>
Run Code Online (Sandbox Code Playgroud)

对于命名空间,addChild中有一个命名空间参数,但这不会输出你想要的......

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

echo $xml->asXML(); // which returns : <tag>yyy<attr>xxx</attr></tag>
Run Code Online (Sandbox Code Playgroud)

PS:如果您在浏览器中运行,请不要忘记htmlspecialcharsecho :)