Php 如何处理含有非法字符的XML

Php 如何处理含有非法字符的XML,php,xml,Php,Xml,我从一家公司收到一个XML文件,其中包含此元素,URL作为值(由于包含未替换的符号,因此XML格式不正确): 但现在我收到一个错误: 警告:simplexml_load_string():实体:第28行:解析器 错误:EntityRef:应为“;”在 正如您已经猜到的,这发生在&字符上 现在我有两个问题: 我能自己把这个&编码成& 作为公司中唯一的软件开发人员,如何处理这种情况。因为我向另一家公司的技术人员解释说,这不是有效的XML,他说的唯一一件事是,他不能更改他这边的XML,因为那样的

我从一家公司收到一个XML文件,其中包含此元素,URL作为值(由于包含未替换的符号,因此XML格式不正确):

但现在我收到一个错误:

警告:simplexml_load_string():实体:第28行:解析器 错误:EntityRef:应为“;”在

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

现在我有两个问题:

  • 我能自己把这个
    &
    编码成
    &

  • 作为公司中唯一的软件开发人员,如何处理这种情况。因为我向另一家公司的技术人员解释说,这不是有效的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页


  • “这是非常糟糕的。”-这使得它在定义上“不是XML”,XML是格式良好的。我特别喜欢你的批评者试图表达的第2个观点,即这样的修复很难看,容易出错,应该是不必要的。1不太有效,因为你必须担心其他实体(例如
    )包括文档中可能定义的内容,尽管该方法背后的思想确实如此。最终,它可能需要regex来完全实现。您可能希望替换
    &
    ,除非它以类似
    &\w+的模式出现
    @Matthew:是的,我应该注意不要在它已经存在的地方替换它&;谨慎更一般。我现在已经修好了。谢谢
    $returnUrl = mysqli_real_escape_string($conn,$xmlData->Request->PunchOutSetupRequest->BrowserFormPost->URL);
    
    $xmlFile = trim(file_get_contents('php://input'));
    $xmlDataEncoded = preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $xmlFile);
    $xmlData = simplexml_load_string($xmlDataEncoded);