PHP-使用CDATA数组转换为XML

时间:2018-07-05 15:40:21

标签: php xml

我需要创建一个XML以通过soap发送,但是我不能。我需要带有CDATA标记的xml,但我做不到。 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);

如何使用CDATA生成此xml以便能够通过SOAP发送?

谢谢你们!

1 个答案:

答案 0 :(得分:1)

What does <![CDATA[]]> in XML mean?所述,CDATA部分是一种在XML文档中包含字符串而无需对其进行解析的方法。因此,从<fruits></fruits>的所有内容都不是实际XML文档的一部分;就SOAP请求而言,它只是一个字符串。

(这种事情在SOAP服务中很常见,因为人们发现解析SOAP代码之外的有效负载更为容易,因此他们将SOAP用作围绕任意内容的大型包装器。它也可能是{{ 1}}或其他有效负载格式。)

假设SOAP服务的所有者还没有做过一件很奇怪的事情,那就是:

<json><![CDATA[{"foo": "bar"}]]></json>

应该完全等效于此:

   <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的函数将处理转义字符串或将其包装在CDATA中,因此您所需要做的就是:

   <xml>
           &lt;fruits&gt;
                &lt;type&gt;G&lt;/type&gt;
                &lt;flav&gt;grape&lt;/flav&gt;
                &lt;orders&gt;
                    &lt;order&gt;
                        &lt;client&gt;12345&lt;/client&gt;
                        &lt;itens&gt;
                            &lt;item&gt;
                                &lt;cod&gt;1&lt;/cod&gt;
                                &lt;name&gt;Grape&lt;/name&gt;
                            &lt;/item&gt;
                            &lt;item&gt;
                                &lt;cod&gt;2&lt;/cod&gt;
                                &lt;name&gt;Apple&lt;/name&gt;
                            &lt;/item&gt;
                        &lt;/itens&gt;
                    &lt;/order&gt;
                &lt;/orders&gt;
            &lt;/fruits&gt;
   </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>'; $soapArgs = array('xml' => $xml); 的方式显然取决于您。