Personalizar errores schemaValidate

  • Autor Autor dBer
  • Fecha de inicio Fecha de inicio
D

dBer

Gamma
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Buenas a todos,

Realizo una serie de validaciones con schemaValidate y me gustaría saber si se pueden personalizar los errores que devuelve, porque no he encontrado información sobre ello.

Gracias,

Un saludo.
 
Verifica esta documentación a ver si puedes tomar algún tip PHP: DOMDocument::schemaValidate - Manual

Lo otro que podrías hacer, es tomar el error y almacenarlo en una variable, luego mostrar el mensaje personalizado al comparar el valor de la variable con los mensajes que ya deberías tener previamente identificados. De acuerdo a lo que leí esa función te devuelve un array con el valor del nivel al que pertenece el error, puedes apoyarte de eso para hacer la comparación de forma más sencilla.

Saludos
 
PHP:
<?php

libxml_use_internal_errors(true); 

$xml = new DOMDocument(); 
$xml->load('archivo.xml');

if(!$xml->schemaValidate('archivo.xsd')) { 
    foreach (libxml_get_errors() as $errores)  

	printf('<strong>XML HA DICHO:</strong> %s <br />', $errores->message );

    libxml_clear_errors();
} 

libxml_use_internal_errors(false); 

?>
 
PHP:
<?php

libxml_use_internal_errors(true); 

$xml = new DOMDocument(); 
$xml->load('archivo.xml');

if(!$xml->schemaValidate('archivo.xsd')) { 
    foreach (libxml_get_errors() as $errores)  

	printf('<strong>XML HA DICHO:</strong> %s <br />', $errores->message );

    libxml_clear_errors();
} 

libxml_use_internal_errors(false); 

?>

Esto devuelve el mensaje de error, pero lo devuelve en ingles, hay alguna manera de ese mensaje en ingles traducirlo a Español?
 
La respuesta es contundente: NO, sin embargo puedes usar artimañas para lograr tu cometido, uno de ellos es trata de identificar y reemplazar los errores sin alterar los símbolos, path, function, type o palabras claves. Por ejemplo:

PHP:
<?php
function traducir($cadena){
	$arr_ingles =   [ 
					"/Element '(\w+)': '(\w+)' is not a valid value of the atomic type '(.*)'./i", 
					"/Start tag expected, '(.*)' not found/i",
					"/Failed to parse the XML resource '(.*)'./i"
			     ];
	
	$arr_español = [
					'El elemento \'${1}\': \'${2}\' no es un valor válido del tipo atómico \'${3}\'.',
					'Etiqueta inicial esperado, \'${1}\' no se encontró',
					'Error al analizar el recurso XML \'${1}\'.'
		       ];
	
	return preg_replace($arr_ingles, $arr_español,  $cadena); 
}

libxml_use_internal_errors(true); 

$xml = new DOMDocument(); 
$xml->load('archivo.xml');

if(!$xml->schemaValidate('archivo.xsd')) { 
    foreach (libxml_get_errors() as $errores)  

	printf('<strong>XML HA DICHO:</strong> %s <br />', traducir($errores->message) );

    libxml_clear_errors();
} 

libxml_use_internal_errors(false); 

?>

No obstante, desde mi punto de vista, no es recomendable éste método, es preferible obtener el error "original", es mucho más preciso para resolver el problema. Además, en Google hay muchas soluciones basándose en el error con el idioma original.
 
La respuesta es contundente: NO, sin embargo puedes usar artimañas para lograr tu cometido, uno de ellos es trata de identificar y reemplazar los errores sin alterar los símbolos, path, function, type o palabras claves. Por ejemplo:

PHP:
<?php
function traducir($cadena){
	$arr_ingles =   [ 
					"/Element '(\w+)': '(\w+)' is not a valid value of the atomic type '(.*)'./i", 
					"/Start tag expected, '(.*)' not found/i",
					"/Failed to parse the XML resource '(.*)'./i"
			     ];
	
	$arr_español = [
					'El elemento \'${1}\': \'${2}\' no es un valor válido del tipo atómico \'${3}\'.',
					'Etiqueta inicial esperado, \'${1}\' no se encontró',
					'Error al analizar el recurso XML \'${1}\'.'
		       ];
	
	return preg_replace($arr_ingles, $arr_español,  $cadena); 
}

libxml_use_internal_errors(true); 

$xml = new DOMDocument(); 
$xml->load('archivo.xml');

if(!$xml->schemaValidate('archivo.xsd')) { 
    foreach (libxml_get_errors() as $errores)  

	printf('<strong>XML HA DICHO:</strong> %s <br />', traducir($errores->message) );

    libxml_clear_errors();
} 

libxml_use_internal_errors(false); 

?>

No obstante, desde mi punto de vista, no es recomendable éste método, es preferible obtener el error "original", es mucho más preciso para resolver el problema. Además, en Google hay muchas soluciones basándose en el error con el idioma original.

Perfecto, gracias por la ayuda! Y estoy contigo, no merece la pena traducirlos, yo pensaba que se podría hacer de manera nativa, pero de no ser así, nada.

Gracias.
 
Atrás
Arriba