是否可以捕获simplexml文件错误?我正在连接到有时会失败的web服务,如果它返回一些http错误或类似内容,我需要让系统跳过一个文件。
答案 0 :(得分:9)
使用@
只是简单的。
如果查看手册,则有一个选项参数:
SimpleXMLElement simplexml_load_file ( string $filename [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false ]]]] )
此处提供所有选项列表:http://www.php.net/manual/en/libxml.constants.php
这是禁止警告的正确方法:
$xml = simplexml_load_file('file.xml', 'SimpleXMLElement', LIBXML_NOWARNING);
答案 1 :(得分:6)
你在谈论两件不同的事情。 HTTP错误与XML文件是否有效无关,因此您正在查看两个独立的错误处理区域。
您可以利用libxml_use_internal_errors()来抑制任何XML解析错误,然后在每次解析操作后手动检查它们(使用libxml_get_errors())。我建议这样做,因为你的脚本不会产生大量的E_WARNING
消息,但你仍然会找到无效的XML文件。
对于HTTP错误,处理这些错误取决于您如何连接到Web服务并检索数据。
答案 2 :(得分:6)
如果您对网络服务失败时的错误报告或日志记录不感兴趣,可以使用错误抑制运算符:
$xml= @simplexml_load_file('http://tri.ad/test.xml');
if ($xml) {
// Do some stuff . . .
}
但这是一个简单的黑客攻击。更强大的解决方案是使用cURL加载XML文件,记录任何失败的请求,解析随simplexml_load_string
返回的任何XML文档,记录任何XML解析错误,然后使用有效的XML执行一些操作。
答案 3 :(得分:5)
出错时,你的simplexml_load_file应该返回false。所以做一些简单的事情:
$xml = @simplexml_load_file('myfile');
if (!$xml) {
echo "Uh oh's, we have an error!";
}
是一种检测错误的方法。
答案 4 :(得分:2)
您可以在PHP中设置错误处理程序,以便在出现任何PHP错误时抛出异常:(示例和其他文档在此处:PHP.net)
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
答案 5 :(得分:1)
另一种选择是使用libxml_use_internal_errors()
函数来捕获错误。然后可以使用libxml_get_errors()
函数检索错误。如果要检查特定错误是什么,这将允许您循环遍历它们。如果你确实使用这种方法,你需要确保在完成它们时清除内存中的错误,这样它们就不会浪费你的内存空间。
以下是一个例子:
<?php
//Store errors in memory rather than outputting them
libxml_use_internal_errors(true);
$xml = simplexml_load_file('myfile.xml');
if (!$xml){
//Exit because we can't process a broken file
exit;
}
//Important to clear the error buffer
libxml_clear_errors();
//Display your xml code
print_r($xml);
另一个实际利用我们捕获的错误的例子:
<?php
//Store errors in memory rather than outputting them
libxml_use_internal_errors(true);
$xml = simplexml_load_file('myfile.xml');
if (!$xml){
echo "Your script is not valid due to the following errors:\n";
//Process error messages
foreach(libxml_get_errors() as $error){
echo "$error";
}
//Exit because we can't process a broken file
exit;
}
//Important to clear the error buffer
libxml_clear_errors();
//Display your xml code
print_r($xml);
答案 6 :(得分:0)
if (!$xml=simplexml_load_file('./samplexml.xml')) {
trigger_error('Error reading XML file',E_USER_ERROR);
}
foreach ($xml as $syn) {
$candelete = $syn->candelete;
$forpayroll = $syn->forpayroll;
$name = $syn->name;
$sql = "INSERT INTO vtiger (candelete, forpayroll, name) VALUES('$candelete','$forpayroll','$name')";
$query = mysql_query($sql);
}