PHP - 在带有SoapClient的Envelope中使用多个xmlns

时间:2015-10-19 07:58:35

标签: php xml soap namespaces soap-client

我正在尝试使用soap调用信封中的多个xmlns命名空间进行SOAP调用,但我无法弄清楚如何正确地执行此操作...

这是我现在的代码:

$soapClient = new SoapClient(WSDL_URL, array(
            "trace" => true,
            "exceptions" => true
        ));
$soapClient->__setLocation(WSDL_LOCATION);

$request = '
        <ns1:someNodeName xmlns="http://some.webservice.url.com">
            <ns2:someOtherNodeName>
                // [REQUEST DETAILS]
            </ns2:someOtherNodeName>
        </ns1:someNodeName>
    ';

$params = new SoapVar($request, XSD_ANYXML);

try {
    $results = $soapClient->someFunctionName($params);
    return $results;
}
catch (Exception $e) {
    $error_xml =  $soapClient->__getLastRequest();
    echo $error_xml . "\n";
    echo $e->getMessage() . "\n";
}

此代码为我提供了如下XML请求:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://some.webservice.url.com">
    <SOAP-ENV:Body>
        <ns1:someNodeName xmlns="http://some.webservice.url.com">
            <ns2:someOtherNodeName>
                // [REQUEST DETAILS]
            </ns2:someOtherNodeName>
        </ns1:someNodeName>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我想要改变的是信封线,以获得类似:

<SOAP-ENV:Envelope 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns1="http://some.webservice.url.com" 
    xmlns:ns2="http://some.other.webservice.url.com"
>

有什么方法可以达到这个目的吗?

1 个答案:

答案 0 :(得分:1)

XMLNS属性是命名空间定义,如果在该命名空间中添加节点,则会添加它们。它们不需要位于根元素上,而是位于使用它或其祖先之一的元素上。

$request = '
    <ns1:someNodeName 
       xmlns:ns1="http://some.webservice.url.com"                 
       xmlns:ns2="http://some.other.webservice.url.com">
        <ns2:someOtherNodeName>
            // [REQUEST DETAILS]
        </ns2:someOtherNodeName>
    </ns1:someNodeName>
';

如果您动态创建XML,则应使用DOM或XMLWriter等XML扩展。它们具有使用命名空间创建元素的特定方法,并将自动添加定义。

$xmlns = [
  'ns1' => "http://some.webservice.url.com",                 
  'ns2' => "http://some.other.webservice.url.com"
];

$document = new DOMDocument();
$outer = $document->appendChild(
  $document->createElementNS($xmlns['ns1'], 'ns1:someNodeName')
);
$inner = $outer->appendChild(
  $document->createElementNS($xmlns['ns2'], 'ns2:someOtherNodeName')
);
$inner->appendChild(
  $document->createComment('[REQUEST DETAILS]')
);

$document->formatOutput = TRUE;
echo $document->saveXml($outer);

输出:

<ns1:someNodeName xmlns:ns1="http://some.webservice.url.com">
  <ns2:someOtherNodeName xmlns:ns2="http://some.other.webservice.url.com">
    <!--[REQUEST DETAILS]-->
  </ns2:someOtherNodeName>
</ns1:someNodeName>