从公司收到一个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);
但现在收到错误:
警告:simplexml_load_string():实体:第28行:解析器 错误:EntityRef:期待';'在
正如您已经猜到的那样,这发生在&
字符。
所以现在我有两个问题:
在解析之前,我可以自己在PHP中将此&
编码为&
。
如何处理这种情况作为公司中唯一的软件开发人员。因为我向另一家公司的技术人员解释说这不是有效的XML,他说的唯一一件事就是他不能改变他身边的XML,因为那时也接收他们XML的其他公司将不再适用。我们公司希望这个项目成功,因为另一家公司是我们公司的巨大利润。那么如何处理来自其他公司的无效代码呢?
更新
我需要解决问题,因为他们(另一家公司)无法将其更改为&amp;所以我做了以下修复问题:
$xmlFile = trim(file_get_contents('php://input'));
$xmlDataEncoded = preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $xmlFile);
$xmlData = simplexml_load_string($xmlDataEncoded);
答案 0 :(得分:2)
是的,您可以将收到的文字数据视为文本(它不是XML),并使用手动或自动的基于字符串的方法将&
替换为&
,注意不要在已经被用作实体的地方更换它。它很丑陋,容易出错,而且应该是不必要的。
您告诉任何关心公司没有发送XML并且正在迫使合作伙伴解决其缺点的人。然后你变得足够大,公司将修复他们破损的代码或失去你作为合作伙伴。如果这不可行,请参阅#1。