SoapClient将标签(在某些标签内)替换为htmlentities

时间:2016-04-28 09:57:16

标签: php xml laravel soap-client html-entities

问题:我正在向第三方服务器发送SOAP请求,并且在我的一个标签内部我已全部“<” “>” 中替换为html-entities < >

信息: 假设我有这个类(为了清晰起见,简化和伪编码):

Class SoapSender {
    private $session = 'sessionHash';
    private $soap = new SoapClient(/* settings */);

    public function create() {
        try {
            $agr = [];
            $agr['SessionToken'] = $this->session;
            $agr['Document'] = $this->prepareDocument();

            $request = $this->soap->createRequest($agr); // 3rd-party call

        } catch (SoapFault $f) {
            /* handle exception */
        }
    }

第三方的文档说<Document>应该是XML字符串,所以我这样做:

private function prepareDocument() {
        $arr = [
            /* Create all sub-tags of <Document> */
        ];

        $xml = Formatter::make($arr, 'array')->toXml();
        // this operations required for valid structure
        $xml = str_replace(array('<?xml version="1.0" encoding="utf-8"?>','<xml>','</xml>'), '', $xml);
        $xml = str_replace(['Subject_1', 'Subject_2'], 'Subject', $xml);
        $xml = str_replace(['Period_1', 'Period_2'], 'Period', $xml);
        $xml = preg_replace('/Store_[1-9]/', 'Store', $xml);
        return $xml;

FormatterSoapBox/laravel-formatter

Soo,当我发送请求并收到错误的回复时,我转储$this->soap->__getLastRequest()并看到:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://someurl.com">
<SOAP-ENV:Body><ns1:CreateRequest>
<Document>
&lt;General&gt;&lt;Product&gt;Bread&lt;/Product&gt;&lt;DateBeg&gt;2016-04-04T00:00:00&lt;/DateBeg&gt;&lt;DateEnd&gt;2017-04-03&lt;/DateEnd&gt;&lt;.....
...........blah-blah....
</Document>
<SessionToken>SessionTokeon</SessionToken></ns1:CreateRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>

到目前为止我所拥有的内容: debuging prepareDocument说我在utf-8中有完整的xml字符串,所有标记都是完整的,因此将它们编码为html实体会在SOAP请求中发生。只有Document标记被编码,其他标记都可以。 我使用相同方法的所有其他服务,但不同的第三方作品完美无缺。 SOAP UI发送此请求(但已解码回正常)可以正常工作。一切都发生在laravel项目中。

问题再次出现:我正在向第三方服务器发送请求,并且在我的一个标签内部我已全部“&lt;” “&gt;” 中替换为html-entities &lt; &gt;

问题:我该怎么做才能解决这个问题?

0 个答案:

没有答案