#php #xml #soap
#php #xml #soap
Вопрос:
Я создаю XML-документ, используя PHP XMLWriter
.
$xmlWriter = new XMLWriter();
$xmlWriter->openMemory(); //generate XML in-memory, not on disk
//Please keep the indentation intact to preserve everybody's sanity!
$xmlWriter->startElement('RootElement');
// ...
$xmlWriter->endElement();
$myXml = $xmlWriter->outputMemory(true);
Теперь я подключаюсь к службе SOAP в режиме, отличном от WSDL.
$soapClient = new SoapClient(null, array(
"location" => "https://theservice.com:1234/soap/",
"uri" => "http://www.namespace.com",
"trace" => 1
)
);
$params = array(
new SoapParam($myXml, 'param')
);
$result = $soapClient->__soapCall('method', $params);
Проблема в том, что сообщение SOAP, полученное службой SOAP, содержит мои данные в виде экранированных символов XML. (Предупреждение: впереди фиктивное сообщение SOAP!)
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope" ...>
<SOAP-ENV:Header>
...
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:method>
<Request xsi:type="xsd:string">
amp;<Rootamp;>
(escaped data)
amp;</Rootamp;>
</Request>
</ns1:method>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Служба SOAP не будет работать с экранированными данными, но, с другой стороны, я не экранирую свои данные, SoapClient
это делает. Как мне заставить SoapClient
отправлять неэкранированные данные?
Ответ №1:
Экранирование символов является ожидаемым поведением XmlWriter::writeElement
метода.
Мне потребовалось некоторое время, чтобы понять это, но ответ был прост: поместите a SoapVar
с XSD_ANYXML
параметром в SoapParam
:
$params = array(
new SoapParam(new SoapVar($myXml, XSD_ANYXML), 'param')
);
В документации SoapVar упоминается, что его вторым параметром (encoding) может быть «одна из констант XSD_ …«, которые не задокументированы в документах PHP.