如何处理包含非法字符的 XML


How to deal with XML which has illegal characters

从一家公司,我收到一个XML文件,其中包含此元素,其中URL作为值(由于包含未转义的&符号,这使得XML格式不正确(:

  <BrowserFormPost>
            <URL>https://example.com/asdsad?type=1&id2</URL>
  </BrowserFormPost>

他们不将&编码为&amp;,这使得它不是XML。现在的问题是:我要求他们正确编码URL,但不幸的是,他们不能。他们购买了ERP软件,他们只能提供这些数据。

现在在我的PHP中,我用简单的xml解析这个XML:

$returnUrl = mysqli_real_escape_string($conn,$xmlData->Request->PunchOutSetupRequest->BrowserFormPost->URL);

但现在我收到一个错误:

警告:simplexml_load_string((:实体:第 28 行:解析器 错误:实体引用:期望在

正如您已经猜到的那样,这发生在&角色身上。

所以现在我有两个问题:

  1. 我可以自己在解析之前将此&编码为在 PHP 中&amp;吗?

  2. 作为公司中唯一的软件开发人员,如何处理这种情况。因为我向另一家公司的技术人员解释说,这不是有效的XML,他唯一说的是他不能改变他身边的XML,因为那样其他公司也收到他们的XML,将不再工作。我们公司希望这个项目成功,因为另一家公司对我们公司来说是一笔巨大的利润。那么如何处理来自其他公司的无效代码呢?

更新

我需要解决问题,

因为他们(另一家公司(无法将其更改为,因此我执行以下操作来解决问题:

$xmlFile = trim(file_get_contents('php://input'));
$xmlDataEncoded = preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $xmlFile);
$xmlData = simplexml_load_string($xmlDataEncoded);
  1. 是的,您可以将收到的文本数据视为文本(它不是 XML(,并使用手动或自动基于字符串的方法将&替换为&amp;,注意不要在它已经用作实体的地方替换它。 它很丑陋,容易出错,应该是不必要的。

  2. 你告诉任何关心的人,公司没有发送XML,而是强迫合作伙伴解决他们的缺点。 然后你变得足够大,以至于公司将修复他们损坏的代码或失去你作为合作伙伴。 如果这不可行,请参阅 #1。