How to avoid string could not be parsed as xml error?

时间:2018-02-01 18:05:59

标签: php xml

My code is parsing xml using SimpleXMLElement class as shown below

  $xml = new SimpleXMLElement($response, LIBXML_ERR_ERROR, false, 'http://awis.amazonaws.com/doc/2005-07-11');

The xml data is provided by one of the AWS services.

Very frequently I encounter "String Could not be parsed as XML" error which causes the script to terminate. How do you get the script to ignore this error and keep running?

As I have said earlier, the xml data is provided by API and I don't have any control over the contents of the xml data. Is there a way to validate the data before I instantiate the class?

2 个答案:

答案 0 :(得分:1)

  

我无法控制xml数据的内容

是的,你这样做。您将变量中的整个响应作为字符串,您可以按照自己想象的方式处理它。

从记录触发错误的响应开始。然后从日志中获取一个并在输入上的单独php文件中运行new SimpleXmlElement部分。如果失败,您就知道数据有问题。删除一半数据并再次运行解析器。如果通过,则恢复已删除的部分并删除另一部分。如果它失败了,继续缩小数据范围,直到达到邪恶的根源。

经常发生在写得不好的xml提供程序上,他们将html实体放在xml文件中而不声明它们,或者当它们不得不等时它们不会转义撇号。

如果您发现这种情况,可以在解析之前运行str_replace来修复xml。

这是一个令人悲伤的现实,它与所有整齐的w3c标准背道而驰,但有时你必须走一条肮脏的道路才能使它发挥作用。干杯!

答案 1 :(得分:1)

不要将其称为XML数据。将其称为非XML数据。这有助于建立正确的心态。当您与这些数据的供应商交谈时,不要让他们误以为他们正在提供XML。如果他们确实提供了XML,你的生活会更容易,而且你需要确保他们知道这一点。

如果它不是XML,并且您仍然想要解析它(而不是简单地将其返回给发件人,因为它不合适),那么您需要知道它实际上是什么。任何程序都无法解析语法完全不可预测的数据。你需要找出它与XML的不同之处,然后你必须找到一些在它被破坏的地方修复它的策略,你只有在你对它的破碎性质有了一些了解时才能做到。例如,如果问题是缺少属性值周围的引号,那么您的策略将与处理不匹配的元素标记完全不同。