为什么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数组转化为普通数组

PHP SimpleXMLElement xpath

RL系列蒙特卡罗方法——Soap Bubble

快速将 simpleXMLObject 转换为 STDClass?

PHP:SimpleXMLElement() 类和 SimpleXML_load_string() 有啥区别?

从PHP SimpleXMLElement中提取数组