如何在PHP中使用schemaValidate()验证XML时将警告消息作为字符串获取?

时间:2009-08-28 08:39:06

标签: php xml xsd

我有这个代码来根据XSD文件验证XML文件:

$file = 'test.xml';
$schema = 'test.xsd';
$dom = new DOMDocument;
$dom->load($file);


if ($dom->schemaValidate($schema)) {
    print "$file is valid.\n";
} else {
    print "$file is invalid.\n";
}

如果xml文件无效,则说它无效。 然而,它无效的原因(例如价格不是整数)仅在PHP警告中给出,我必须禁止它,以便用户不会看到它(使用error_reporting(0))。

如何获取该消息的文本并将其传递给用户,就像我在C#中使用try / catch一样?

3 个答案:

答案 0 :(得分:16)

我认为您可以使用libxml的错误处理函数:

简单示例:

$file = 'test.xml';
$schema = 'test.xsd';
$dom = new DOMDocument;
$dom->load($file);

libxml_use_internal_errors(true);     
if ($dom->schemaValidate($schema)) {
    print "$file is valid.\n";
} else {
    print "$file is invalid.\n";
    $errors = libxml_get_errors();
    foreach ($errors as $error) {
        printf('XML error "%s" [%d] (Code %d) in %s on line %d column %d' . "\n",
            $error->message, $error->level, $error->code, $error->file,
            $error->line, $error->column);
    }
    libxml_clear_errors();
}
libxml_use_internal_errors(false); 

答案 1 :(得分:0)

如果您只需要打印,则可以定义自定义error handler以打印错误。

答案 2 :(得分:0)

这是我如何做到的:

$errs = [ ];
set_error_handler ( function ($severity, $message, $file, $line) use (&$errs) {
    $errs [] = $message;
} );
$validated = $domd->schemaValidate ( 'factinv-3-0.xsd' );
restore_error_handler ();

错误描述现在是$ errs,如果有的话。