为什么SimpleXMLElement为所有肥皂孩子添加前缀?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么SimpleXMLElement为所有肥皂孩子添加前缀?相关的知识,希望对你有一定的参考价值。
我是第一次构建SOAP
消息并使用php进行播放。
要求是qazxsw poi版本qazxsw poi with Style / Encoding:Document / Literal pattern。
使用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();
题
为什么会这样?
是否可以禁用此行为?
@ splash58的评论确实回答了你的问题。
链接的问题有一个答案,可以完美地解释发生了什么。
对于SimpleXML,c需要一个命名空间。如果指定一个,它将获取xmlns属性,因为之前未声明您指定的内容。如果没有为c指定命名空间,它将从父节点继承命名空间。这里唯一的选择是ns1。 (这发生在d。)
为了防止父命名空间的出现并省略空的xmlns,你需要在父节点上使用像
<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>
给你没有ns。
证明:
xmlns="http://example.com"
哪个输出:
$it->addChild('c', 'no ns', 'http://example.com')
以上是关于为什么SimpleXMLElement为所有肥皂孩子添加前缀?的主要内容,如果未能解决你的问题,请参考以下文章
php中将SimpleXMLElement Object数组转化为普通数组
快速将 simpleXMLObject 转换为 STDClass?