Создание SOAP-запроса с помощью PHP - как добавить атрибуты к тегам XML? - PullRequest
6 голосов
/ 10 сентября 2009

Я пытаюсь сгенерировать следующий XML в моем вызове SOAP:

<CResponse>
    <ID>int</ID>
    <Response Action="Apply">
        <Question ID="$someint">
            <Responses>
                <Response ID="$someotherint" />
                <Response ID="$yetanotherint" />
            </Responses>
        </Question>
    </Response>
</CResponse>

Я могу создать большую часть вызова просто отлично - я наконец-то понял, что вложенные массивы - мои друзья, но я не знаю, как добавить эти атрибуты ID="$int" и Action="Apply" в различные теги. Я уверен, что это довольно легко, но я просто не могу понять это.

ТИА.

Ответы [ 3 ]

13 голосов
/ 14 сентября 2009

Вы должны иметь возможность добавлять атрибуты со следующим синтаксисом:

array("foo" => array("_" => "cheese", "bar"=>"moo"));

Это должно привести к следующему XML

<foo bar="moo">cheese</foo>
1 голос
/ 17 июня 2016

У меня была та же проблема с атрибутами, и я в итоге использовал XMLWriter, как прокомментировано в этом посте: http://eosrei.net/articles/2012/01/php-soap-xml-attributes-namespaces-xmlwriter

Построить петицию:

$prefix = 'ns1';

$xml = new \XMLWriter();
$xml->openMemory();

$xml->startElementNs($prefix, 'SomeRequest', null);
    $xml->writeElementNs($prefix, 'SchemaVersion', null, "2.0");
    $xml->startElementNs($prefix, 'SomeComplexType', null);
        $xml->writeElementNs($prefix, 'MessageId', null, 11);
        $xml->writeElementNs($prefix, 'Timestamp', null, '2013-07-05T14:43:43.649-04:00');
        $xml->startElementNs($prefix, 'Authentication', null);
            $xml->writeAttribute('SomeAttribute', '12312');
            $xml->writeElementNs($prefix, 'UserId', null, 'myUser');
            $xml->writeElementNs($prefix, 'Password', null, 'somePass');
        $xml->endElement();
    $xml->endElement();
$xml->endElement();

$request = new SoapVar($xml->outputMemory(), XSD_ANYXML);

$result = $this->call('submit', $request);

Результат:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://xml.somehost.com/XMLSchema/Connect">
   <SOAP-ENV:Body>
      <ns1:SomeRequest>
         <ns1:SchemaVersion>2.0</ns1:SchemaVersion>
         <ns1:SomeComplexType>
            <ns1:MessageId>11</ns1:MessageId>
            <ns1:Timestamp>2013-07-05T14:43:43.649-04:00</ns1:Timestamp>
            <ns1:Authentication SomeAttribute='12312'>
               <ns1:UserId>myUser</ns1:UserId>
               <ns1:Password>somePass</ns1:Password>
            </ns1:Authentication>
         </ns1:SomeComplexType>
      </ns1:SomeRequest>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
1 голос
/ 14 сентября 2009

Я не знаю о (несколько странном) синтаксисе, предложенном JJ (и, судя по вашему повторному отправлению вопроса, он не работает), но вы должны иметь возможность формировать свой XML-запрос так, как вам хочется построив его более или менее «вручную» с использованием класса SoapVar с кодировкой XSD_ANYXML.

См. этот комментарий пользователя к документации SoapVar Constructor для примера того, как это сделать.

Если XML, который вам нужно создать, становится более сложным, рассмотрите возможность использования SimpleXML или DOMDocument для его сборки вместо написания напрямую.

(Мне все еще странно, что не должно быть более простого способа сделать это, но пока я не нашел его.)


Редактировать: только что нашел другой пример, использующий кодировку XSD_ANYXML в этот вопрос, запрашивающий более простой способ сделать это . К сожалению, пока никто не придумал более простой способ: /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...