Я пытаюсь создать SOAP-запрос для экспресс-оплаты PayPal с помощью SimpleXML. Тем не менее, я испытываю поведение, которое пока не понимаю.
Конверт и его заголовок генерируются следующим образом:
$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>
Что я здесь не так делаю?
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');
Других решений пока нет …