为什么SimpleXMLElement为所有肥皂孩子添加前缀?

时间:2017-12-18 20:30:50

标签: php xml soap simplexml

我第一次构建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>

问题

为什么会这样?

是否可以禁用此行为?

1 个答案:

答案 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>