PHP SoapClient отправляет экранированные символы XML

#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.