Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Валидация XML-файла
Форумы портала PHP.SU » » XML и его обработка » Валидация XML-файла

Страниц (1): [1]
 

1. Belotur - 22 Февраля, 2013 - 11:44:04 - перейти к сообщению
Всем здравия!

Возникла необходимость валидации 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;
}
}

 

Powered by ExBB FM 1.0 RC1