2010-11-09 53 views
6

我有一个脚本来解析一些XML(adf)的东西。有时我们会收到破碎的XML数据(即语法,无结束标签等)。PHP捕获一个SimpleXMLElement解析错误

SimpleXMLElement抛出一个错误并杀死我的脚本,怎么可能分配类似$xml_body = new SimpleXMLElement ($adf_xml);并捕获解析异常?有消息


未捕获的异常 '异常' 在/home//Work//script/email_leads.php:46 '字符串不能被解析为XML'
堆栈跟踪:
0 /家//Work//script/email_leads.php(46):SimpleXMLElement - > __ construct('<?xml version =“...')
1 /home//Work//script/email_leads.php(97): generateFeed()
2 {main}

+0

呃,你确定在这里使用SimpleXML是你想要的吗?如果你期望非格式良好的数据,你不应该使用draconian xml,而是使用一些DOM解析器。 – NikiC 2010-11-09 19:35:05

+0

这是一个从INBOX(imap)获取输入的chron'd脚本... – 2010-11-09 20:16:19

+0

[php:catch异常并继续执行,可能吗?]可能重复(http://stackoverflow.com/questions/2132759/php-catch-exception-and-continue-execution-is-it-possible) – hakre 2013-03-05 10:43:16

回答

4
libxml_use_internal_errors(true); 
+0

libxml_use_internal_errors确实会清除错误日志,我的脚本在抛出Parse错误时仍然会死掉......感谢您的帮助/ tip tho :) – 2010-11-09 19:54:16

+0

我曾经投票赞成顶级投票答案,但是,我认为最好是通过这里提到的函数来抑制错误。您可以使用libxml_get_errors或libxml_get_last_error来了解发生了什么。 – cwhsu 2015-04-17 02:16:53

11

好了,显然抓住XML解析错误是有点圣杯的......最后我只是

try { $x = new SimpleXMLElement($y); } catch (Exception $e) { echo $e; } 
+4

try/catch似乎不适用于SimpleXMLElement。或者至少它没有为我加载一个非xml文件。 – Jake 2014-05-14 19:36:04

+3

我发现这对我也不起作用。我必须使用: $ x = new \ SimpleXMLElement($ xmlString,LIBXML_NOERROR); 这似乎给我一个可捕获的例外。有关参考,请参阅[LIBXML_NOERROR]的PHP手册(http://php.net/manual/en/libxml.constants.php) – PanPipes 2015-09-08 16:05:24

0

xml_parse返回一个布尔值指示是否XML已成功解析。因此,这应该工作:

$fp = fopen($xml_file, "r"); 
$xml_data = fread($fp, 80000); 

if(!(xml_parse($xml_parser, $xml_data, feof($fp)))){ 
    # do something 
}