2009-08-28 21 views
6

Tengo este código para validar un archivo XML con un archivo XSD:¿Cómo obtener el mensaje de advertencia como una cadena al validar XML con schemaValidate() en PHP?

$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"; 
} 

Si el archivo XML no es válido, entonces se dice que no es válido. El motivo por el que no es válido (por ejemplo, el precio no es un número entero), sin embargo, solo aparece en una advertencia de PHP, que debo suprimir para que el usuario no lo vea (con error_reporting (0)).

¿Cómo puedo obtener el texto de ese mensaje y pasarlo al usuario, como lo haría en C# con un try/catch?

Respuesta

14

Creo que se puede utilizar las funciones de gestión de errores libxml 's para éste:

ejemplo simple:

$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); 
0

Si solo necesita imprimir, puede definir su error handler personalizado para imprimir el error.

0

aquí es cómo lo hice:

$errs = [ ]; 
set_error_handler (function ($severity, $message, $file, $line) use (&$errs) { 
    $errs [] = $message; 
}); 
$validated = $domd->schemaValidate ('factinv-3-0.xsd'); 
restore_error_handler(); 

descripciones de error ahora están en $ errs, si hay alguno.

Cuestiones relacionadas