2015-03-12 2 views
0

Я пытаюсь создать запрос SOAP для экспресс-проверки PayPal с SimpleXML. Тем не менее, я испытываю такое поведение, которого я еще не понимаю.Удалить автоматически прикладное пространство имен в SimpleXML php

Конверт и его заголовок генерируются таким образом:

$envelope = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?> 
    <SOAP-ENV:Envelope 
     xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:ns1="urn:ebay:apis:eBLBaseComponents" 
     xmlns:ns2="urn:ebay:api:PayPalAPI" 
    /> 
'); 
$header = $envelope->addChild('SOAP-ENV:Header'); 
$requesterCredentials = $header->addChild('ns2:RequesterCredentials'); 
$credentials = $requesterCredentials->addChild('ns1:Credentials'); 
$credentials->addChild('ns1:Username', 'foo'); 
$credentials->addChild('ns1:Password', 'bar'); 

что дает следующий результат:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:ns1="urn:ebay:apis:eBLBaseComponents" 
        xmlns:ns2="urn:ebay:api:PayPalAPI"> 
    <SOAP-ENV:Header> 
     <SOAP-ENV:RequesterCredentials> 
      <SOAP-ENV:Credentials> 
       <SOAP-ENV:Username>foo</SOAP-ENV:Username> 
       <SOAP-ENV:Password>bar</SOAP-ENV:Password> 
      </SOAP-ENV:Credentials> 
     </SOAP-ENV:RequesterCredentials> 
    </SOAP-ENV:Header> 
</SOAP-ENV:Envelope> 

Каждый узел теперь с префиксом SOAP-ENV, который не то, что я хочу. Только корневой узел и заголовок должны иметь префикс SOAP-ENV, другие теги должны получить определенное пространство имен, добавленное в addChild().

Желательный результат должен быть:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:ns1="urn:ebay:apis:eBLBaseComponents" 
        xmlns:ns2="urn:ebay:api:PayPalAPI"> 
    <SOAP-ENV:Header> 
     <ns2:RequesterCredentials> 
      <ns1:Credentials> 
       <ns1:Username>foo</ns1:Username> 
       <ns1:Password>bar</ns1:Password> 
      </ns1:Credentials> 
     </ns2:RequesterCredentials> 
    </SOAP-ENV:Header> 
</SOAP-ENV:Envelope> 

Что я здесь делаю неправильно?

+2

Чтобы объяснить, что происходит, SimpleXML использует пространство имен элемента в пространстве имен по умолчанию. Вы добавляете новый узел элемента без определения пространства имен, SimpleXML использует пространство имен по умолчанию. Префиксы оптимизируются, поэтому они объединяются в префикс SOAP-ENV. – ThW

ответ

2

addChild занимает пространство имен в качестве третьего параметра:

$requesterCredentials = $header->addChild('RequesterCredentials', null, 'urn:ebay:api:PayPalAPI'); 
$credentials = $requesterCredentials->addChild('Credentials', null, 'urn:ebay:apis:eBLBaseComponents'); 
$credentials->addChild('Username', 'foo', 'urn:ebay:apis:eBLBaseComponents'); 
$credentials->addChild('Password', 'bar', 'urn:ebay:apis:eBLBaseComponents'); 
Смежные вопросы