Мне нужно создать xml для отправки через мыло, но я не могу. Мне нужен xml с тегом CDATA, и я не могу этого сделать. XML должен быть в следующем формате:
<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser = "url-here">
<soapenv:Header/>
<soapenv:Body>
<ser:callServiceMethod>
<!--Optional:-->
<xml>
<![CDATA[<fruits>
<type>G</type>
<flav>grape</flav>
<orders>
<order>
<client>12345</client>
<itens>
<item>
<cod>1</cod>
<name>Grape</name>
</item>
<item>
<cod>2</cod>
<name>Apple</name>
</item>
</itens>
</order>
</orders>
</fruits>]]>
</xml>
</ser:callServiceMethod>
</soapenv:Body>
</soapenv:Envelope>
Я попытался создать массив для генерации xml, это работает, но без CDATA, например:
$soapArgs = array(
'xml' => array(
//need CDATA here
'fruits' => array(
'type' => 'G',
'flav' => 'grape',
'orders' => array(
'order' => array(
'client' => 12345,
'itens' => array(
'item' => array(
'cod' => 1,
'name' => 'Grape',
),
'item' => array(
'cod' => 2,
'name' => 'Apple',
),
)
)
)
)
)
);
$soapClient = new SoapClient($params);
$serviceResponse = $soapClient->callServiceMethod($soapArgs);
Как мне сгенерировать этот xml с CDATA, чтобы можно было отправлять через SOAP?
Спасибо вам, ребята!






Как обсуждалось в разделе Что означает <! [CDATA []]> в XML?, раздел CDATA - это способ включения строки в XML-документ без ее анализа. Следовательно, все, от <fruits> до </fruits>, является не является частью фактического XML-документа; что касается запроса SOAP, это просто строка.
(Подобные вещи довольно распространены в сервисах SOAP, потому что людям легче анализировать полезную нагрузку вне их кода SOAP, поэтому они используют SOAP как большую оболочку вокруг произвольного контента. С таким же успехом это может быть <json><![CDATA[{"foo": "bar"}]]></json> или какой-либо другой формат. полезной нагрузки.)
Если предположить, что владелец службы SOAP не сделал чего-то действительно странного, это:
<xml>
<![CDATA[<fruits>
<type>G</type>
<flav>grape</flav>
<orders>
<order>
<client>12345</client>
<itens>
<item>
<cod>1</cod>
<name>Grape</name>
</item>
<item>
<cod>2</cod>
<name>Apple</name>
</item>
</itens>
</order>
</orders>
</fruits>]]>
</xml>
должен быть полностью эквивалентен этому:
<xml>
<fruits>
<type>G</type>
<flav>grape</flav>
<orders>
<order>
<client>12345</client>
<itens>
<item>
<cod>1</cod>
<name>Grape</name>
</item>
<item>
<cod>2</cod>
<name>Apple</name>
</item>
</itens>
</order>
</orders>
</fruits>
</xml>
Функция, создающая XML, будет обрабатывать экранирование строки или упаковывать ее в CDATA, поэтому все, что вам нужно, это:
$xml = '<fruits>
<type>G</type>
<flav>grape</flav>
<orders>
<order>
<client>12345</client>
<itens>
<item>
<cod>1</cod>
<name>Grape</name>
</item>
<item>
<cod>2</cod>
<name>Apple</name>
</item>
</itens>
</order>
</orders>
</fruits>';
$soapArgs = array('xml' => $xml);
Как создать строку $xml, очевидно, зависит от вас.
@JuniorMaia Вам просто нужна отдельная функция для создания XML, который вы хотите, но вы хотите указать это. Если вы хотите указать его как массив, просто выполните поиск по запросу «PHP array to XML», и вы найдете множество примеров того, как это сделать, которые будут работать в таком простом случае, как этот.
Не могли бы вы привести мне пример?
@JuniorMaia duckduckgo.com/?q=php+%22array+to+xml%22&t=ffsb&ia=qa
Хороший! Но в этом случае вы буквально написали xml в строке, как мне преобразовать мой массив в строку, подобную вашей, или каким-то образом этот массив становится xml в отправке? Потому что я считаю более элегантным создание массива, а не прямой строки.