Как получить предупреждающее сообщение в виде строки при проверке XML с помощью schemaValidate() в PHP?
У меня есть этот код для проверки XML-файла на соответствие XSD-файлу:
$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, которое я должен подавить, чтобы пользователь его не видел (с сообщением об ошибке(0)).
Как я могу получить текст этого сообщения и передать его пользователю, как я бы сделал в C# с помощью try/catch?
6
Author: Edward Tanguay, 2009-08-28
3 answers
Я думаю, вы можете использовать libxml
' s функции обработки ошибок для этого:
-
libxml_use_internal_errors()
чтобы переключиться на обработку ошибок пользователя -
libxml_get_errors()
для извлечения ошибок из буфера ошибокlibxml
; это вернет массивlibXMLError
объекты -
libxml_clear_errors()
чтобы очистить буфер ошибок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);
15
Author: Stefan Gehrig, 2015-07-08 13:04:34
0
Author: Zed, 2009-08-28 08:43:41
Вот как я это сделал:
$errs = [ ];
set_error_handler ( function ($severity, $message, $file, $line) use (&$errs) {
$errs [] = $message;
} );
$validated = $domd->schemaValidate ( 'factinv-3-0.xsd' );
restore_error_handler ();
Описания ошибок теперь содержатся в $errs, если таковые имеются.
0
Author: hanshenrik, 2017-12-08 00:31:10