Personalizar erros schemaValidate

  • Autor Autor dBer
  • Data de início Data de início
Tradução em andamento: em alguns minutos este tópico estará em português. Por enquanto, o conteúdo está no original em espanhol. Ver original
D

dBer

Gamma
Programador
Usuário com poucas negociações! Use sempre o saldo do 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.
 
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
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.
 
Voltar
Topo