如何处理具有非法字符的XML

时间:2016-02-15 15:31:51

标签: php xml

从公司收到一个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行:解析器   错误:EntityRef:期待';'在

正如您已经猜到的那样,这发生在&字符。

所以现在我有两个问题:

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

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

  3. 更新

    我需要解决问题,因为他们(另一家公司)无法将其更改为&amp;所以我做了以下修复问题:

    $xmlFile = trim(file_get_contents('php://input'));
    $xmlDataEncoded = preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $xmlFile);
    $xmlData = simplexml_load_string($xmlDataEncoded);
    

1 个答案:

答案 0 :(得分:2)

  1. 是的,您可以将收到的文字数据视为文本(它不是XML),并使用手动或自动的基于字符串的方法将&替换为&amp;,注意不要在已经被用作实体的地方更换它。它很丑陋,容易出错,而且应该是不必要的。

  2. 您告诉任何关心公司没有发送XML并且正在迫使合作伙伴解决其缺点的人。然后你变得足够大,公司将修复他们破损的代码或失去你作为合作伙伴。如果这不可行,请参阅#1。