PHP:如何修复错误无法解析XML数据?

时间:2018-06-08 01:46:36

标签: php xml zoho

每当我的公司名称中出现& (ampersand)时,就会抛出错误Unable to parse XML data

XML数据:

$xmlData = '<Leads>
<row no="1">
<FL val="Company"><![CDATA[ .$company. ]]></FL>
</row>
</Leads>';

$company = isset($company) && !empty($company) ? str_replace('&', '&amp;', $company) : 'None';

我尝试将&替换为&amp;%26 etc并使用了CDATA,但没有任何效果。

XML似乎仍然有效,但它会抛出错误

<Leads><row no="1"><FL val="Company">test &amp; test</FL></row></Leads>

使用CDATA:

<Leads><row no="1"><FL val="Company"><![CDATA[test & test]]></FL></row></Leads>

它的解决方案是什么?

P.S:我将这个xml数据发送到zoho CRM。 Zoho not accepting company name with & in it.

更新1:

这是将xml数据发送到zoho的URL以及何时获取&amp;它不起作用。

https://crm.zoho.com/crm/private/xml/Leads/insertRecords?newFormat=1&authtoken=authtoken &xmlData=<Leads><row no="1"><FL val="Company">test &amp; test</FL></row></Leads>

OR

https://crm.zoho.com/crm/private/xml/Leads/insertRecords?newFormat=1&authtoken=authtoken &xmlData=<Leads><row no="1"><FL val="Company">test & test</FL></row></Leads>

使用&amp;它应该有效,但它不会。 :(

1 个答案:

答案 0 :(得分:1)

如果您将此作为GET请求发送,则还需要转义网址中的&。一般来说,最好使用特定于格式的匹配API /函数,而不仅仅是字符串。

$document = new DOMDocument();
$row = $document
  ->appendChild($document->createElement('Leads'))
  ->appendChild($document->createElement('row'));
$row->setAttribute('no', '1');
$FL = $row->appendChild($document->createElement('FL'));
$FL->setAttribute('val', 'Company');
$FL->appendChild($document->createTextNode('Foo & Bar'));

$xml = $document->saveXml($document->documentElement);
var_dump($xml);    

$url = 'https://crm.zoho.com/crm/private/xml/Leads/insertRecords?'.
  http_build_query(
    [
      'newFormat' => 1,
      'authtoken' => 'abc1234',
      'xmlData' => $xml
    ]
  );

echo $url;

输出:

string(69) "<Leads><row no="1"><FL val="Company">Foo &amp; Bar</FL></row></Leads>"
https://crm.zoho.com/crm/private/xml/Leads/insertRecords?newFormat=1&authtoken=abc1234&xmlData=%3CLeads%3E%3Crow+no%3D%221%22%3E%3CFL+val%3D%22Company%22%3EFoo+%26amp%3B+Bar%3C%2FFL%3E%3C%2Frow%3E%3C%2FLeads%3E

当然,ZOHO CRM可能不接受其中包含&的公司名称。