我从一家公司收到一个 XML 文件,其中包含此元素,并以 URL 作为值(这使得 XML 由于包含未转义的 & 符号而格式不正确):
<BrowserFormPost>
<URL>https://example.com/asdsad?type=1&id2</URL>
</BrowserFormPost>
它们不会将 &
编码为 &
,这使得它不是 XML。
现在的问题是:我要求他们正确编码 URL,但不幸的是,他们不能。他们买了一个ERP软件,他们只能提供这些数据。
现在在我的 PHP 中,我使用简单的 xml 解析此 XML:
$returnUrl = mysqli_real_escape_string($conn,$xmlData->Request->PunchOutSetupRequest->BrowserFormPost->URL);
但现在我收到一个错误:
Warning: simplexml_load_string(): Entity: line 28: parser error : EntityRef: expecting ';' in
正如您已经猜到的,这发生在 &
字符处。
现在我有两个问题:
我可以在解析之前在 PHP 中将这个
&
编码为&
吗?作为公司唯一的软件开发人员如何处理这种情况。因为我向另一家公司的技术人员解释说,这不是有效的 XML,他唯一说的是他不能更改自己这边的 XML,因为这样其他也接收其 XML 的公司将不再工作。我们公司希望这个项目成功,因为对方公司为我们公司带来了很大的利润。那么如何处理其他公司的无效代码呢?
更新
我需要解决这个问题,因为他们(另一家公司)无法将其更改为&因此我执行了以下操作来解决问题:
$xmlFile = trim(file_get_contents('php://input'));
$xmlDataEncoded = preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $xmlFile);
$xmlData = simplexml_load_string($xmlDataEncoded);
最佳答案
是的,您可以将收到的文本数据视为文本(不是 XML),并使用手动或自动基于字符串的方法将
&
替换为&
,注意不要在已经用作实体的地方替换它。它很丑陋,容易出错,而且应该是不必要的。您告诉任何关心该公司的人,该公司不会发送 XML,而是迫使合作伙伴解决其缺陷。然后,你的规模足够大,公司将修复他们损坏的代码,否则就会失去你这个合作伙伴。如果这不可行,请参阅#1。
关于php - 如何处理含有非法字符的XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35413169/