2017-02-22 7 views
1

Я хочу сгенерировать xml wsdl-запрос с такими параметрами, как tem:sessionId, но мой php-код генерирует x:sessionId. я не знаю, как конвертировать x: в tem:Документ SimpleXML PHP add child с tem: tagName

результат мне нужно:

<?xml version="1.0"?> 
<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> 
    <x:Header/> 
    <x:Body> 
     <tem:GetServicesByProvider> 
      <tem:sessionId>890925</tem:sessionId> 
      <tem:ProviderId>29</tem:ProviderId> 
      <tem:mac/> 
     </tem:GetServicesByProvider> 
    </x:Body> 
</x:Envelope> 

это мой PHP код

private function createXMLRequest($function, $params) 
{ 
    $xml = new \SimpleXMLElement('<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"><x:Header/></x:Envelope>'); 
    $body = $xml->addChild('Body'); 
    $f = $body->addChild($function, ''); 
    foreach ($params as $param) { 
     $f->addChild($param['tag'], $param['text']); 
    } 

    return $xml; 
} 

но он генерирует это:

<?xml version="1.0"?> 
<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> 
<x:Header/> 
<x:Body> 
    <x:GetServicesByProvider> 
     <x:sessionId>890925</x:sessionId> 
     <x:ProviderId>29</x:ProviderId> 
     <x:mac/> 
    </x:GetServicesByProvider> 
</x:Body> 
</x:Envelope> 

ответ

0

Метод SimpleXML addChild (documentation here) имеет d параметр, $namespace, который позволяет определить, какое пространство имен элемент должен быть.

Как это работает немного неудобный, потому что вы должны знать как локальный префикс и в пространстве имен URI это таргетинг ,

Чтобы написать <tem:sessionID> в вашем случае, вы будете использовать

$f->addChild('tem:sessionID', $value, 'http://tempuri.org/'); 

Моей рекомендации поставить URI пространства имен в каком-то постоянная, а затем предварять 'tem:' к каждому элементу добавить:

define('XMLNS_SOAP', 'http://schemas.xmlsoap.org/soap/envelope/'); 
define('XMLNS_TEMP', 'http://tempuri.org/'); 

$xml = new \SimpleXMLElement('<x:Envelope xmlns:x="' . XMLNS_SOAP . '" xmlns:tem="' . XMLNS_TEMP . '"><x:Header/></x:Envelope>'); 

$body = $xml->addChild('Body'); 
$f = $body->addChild($function, ''); 
foreach ($params as $param) { 
    $f->addChild('tem:' . $param['tag'], $param['text'], XMLNS_TEMP); 
} 
+0

Когда я добавляю метод 'tem:' to' addChild', он автоматически удаляет 'tem:'. –

+0

@ 543310 Вы уверены, что в качестве третьего параметра вы также указали правильный URL-адрес пространства имен? Я протестировал этот код, прежде чем опубликовать его, и он произвел именно то, что вы хотите. Попробуйте сами: https://3v4l.org/majj9 – IMSoP

Смежные вопросы