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

标签 php xml

我从一家公司收到一个 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

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

现在我有两个问题:

  1. 我可以在解析之前在 PHP 中将这个 & 编码为 & 吗?

  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),并使用手动或自动基于字符串的方法将 & 替换为 &,注意不要在已经用作实体的地方替换它。它很丑陋,容易出错,而且应该是不必要的。

  2. 您告诉任何关心该公司的人,该公司不会发送 XML,而是迫使合作伙伴解决其缺陷。然后,你的规模足够大,公司将修复他们损坏的代码,否则就会失去你这个合作伙伴。如果这不可行,请参阅#1。

关于php - 如何处理含有非法字符的XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35413169/

相关文章:

c# - 使用命名空间将 Json 转换为 XML 字符串?

c# - 如何将从 XSD 生成的类序列化为 XML

php - 无法获取更新查询以从内爆数组运行

php - Json转php,无法获取我需要的数据

php - 如何检查 MySQL 是否返回 null/empty?

php - 使用 PHP 解析自定义标签

php - 使用 php 和 mysql 从用户的所有好友检索用户个人资料数据

xml - Zend Framework 站点地图验证

java - Java 6 中默认支持 xinclude 吗?

java - 为什么 android HttpURLConnection 缓存输入流结果?