Всем здравия!
Возникла необходимость валидации xml-файлов, передаваемых из учётной системы в Web-приложение. Реализация оказалась довольно проста (для валидации использовалась xsd-схема), кому интересно код ниже.
Однако, есть БОЛЬШАЯ проблема, текст сообщения об ошибке исключительно на английском. Облазил гугл на предмет русификации (локализации), но ничего не нашёл.
Вариантов решения, собственно, три:
- выставление локализации для вывода сообщений на нужном языке (что, видимо, не реализовано при разработке php+libxml);
- сравнение кода ошибки с описанными здесь http://www[dot]xmlsoft[dot]org/html/libxml-xmlerror[dot]html кодами (долго и нет возможности указать какой тег или атрибут подозревается в нарушении валидности документа);
- переопределить функцию получения ошибки, приняв подробности описать по-русски ситуацию.
С благодарностью отозвавшимся.
class XmlSchemaValidation {
/**
* @var string
*/
private $xsd_path;
/**
* @var string
*/
private $xml_path;
/**
* @var Array
*/
private $error_list = array();
/**
* Конструктор класса валидации
*
* @param string путь к файлу xsd-схемы
*
* @return void
* @throws Exception
*/
public function __construct($xsd_path) {
if (!is_file($xsd_path)) {
throw new Exception("Не удалось получить файл xsd-схемы по указанному пути: $xsd_path.");
}
$this->xsd_path = $xsd_path;
}
/**
* Устанавливает путь к файлу xml-документа
*
* @return void
* @throws Exception
*/
public function setXmlDocumentPath($xml_path) {
if (!is_file($xml_path)) {
throw new Exception("Не удалось получить файл xml-документа по указанному пути: $xml_path.");
}
$this->xml_path = $xml_path;
}
/**
* Валидирует xml-документ на соответствие xsd-схеме
*
* @return bool
*/
public function validate() {
libxml_use_internal_errors(true);
$xml = new DOMDocument();
$xml->load($this->xml_path);
// Документ валиден
if ($xml->schemaValidate($this->xsd_path)) {
$this->error_list = array();
return true;
}
// Документ не валиден
$errors_list = libxml_get_errors();
foreach ($errors_list as $item) {
$type = '';
switch ($item->level) {
case LIBXML_ERR_WARNING:
$type = 'Предупреждение';
break;
case LIBXML_ERR_ERROR:
$type = 'Ошибка';
break;
case LIBXML_ERR_FATAL:
$type = 'Фатальная ошибка';
break;
}
$message = trim($item->message);
$error = array(
'type' => $type,
'message' => $message,
'file' => $item->file,
'line' => $item->line
);
$this->error_list[] = $error;
}
libxml_clear_errors();
return false;
}
/**
* Возвращает список ошибок, полученных при валидации
*
* @return array
*/
public function getErrors() {
return $this->error_list;
}
}
1. Belotur - 22 Февраля, 2013 - 11:44:04 - перейти к сообщению