我需要创建一个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发送?
谢谢你们!
答案 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>
<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>';
$soapArgs = array('xml' => $xml);
的方式显然取决于您。