我第一次构建SOAP
消息并使用PHP进行播放。
要求为SOAP
版本1.1
,带有样式/包含:文档/文字模式。
使用SimpleXMLElement
:
$soapEnv = '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope"></soap:Envelope>';
$soapEnvElement = new \SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?>' . $soapEnv);
$soapEnvElement->addChild('soap:Header');
$bodyElement = $soapEnvElement->addChild('soap:Body');
$bodyElement->addChild('node');
echo $soapEnvElement->asXML();
预期输出:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header/>
<soap:Body>
<node/>
</soap:Body>
</soap:Envelope>
实际输出:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header/>
<soap:Body>
<soap:node/>
</soap:Body>
</soap:Envelope>
问题
为什么会这样?
是否可以禁用此行为?
答案 0 :(得分:0)
@ splash58&#39的评论确实回答了你的问题。
链接的问题有一个答案可以完美地解释发生了什么。
对于SimpleXML,c需要一个命名空间。如果指定一个,它将获取xmlns属性,因为之前未声明您指定的内容。如果您没有为c指定命名空间,它将从父节点继承命名空间。这里唯一的选择是ns1。 (这发生在d。)
为了防止父命名空间的入侵并省略空xmlns,您需要父级的
xmlns="http://example.com"
这样的命名空间。然后$it->addChild('c', 'no ns', 'http://example.com')
给你没有ns。
证明:
<?php
// Notice here that I added the extra namespace for http://example.com.
$soapEnv = '<soap:Envelope xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope"></soap:Envelope>';
$soapEnvElement = new \SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?>' . $soapEnv);
$soapEnvElement->addChild('soap:Header');
$bodyElement = $soapEnvElement->addChild('soap:Body');
// Here I am applying the empty namespace so it doesn't inherit from the parent node.
$bodyElement->addChild('node', '', 'http://example.com');
echo $soapEnvElement->asXML();
哪个输出:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns="http://example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header/>
<soap:Body>
<node/>
</soap:Body>
</soap:Envelope>