2009-08-28 6 views
6

J'ai ce code pour valider un fichier XML par rapport à un fichier XSD:Comment obtenir le message d'avertissement sous forme de chaîne lors de la validation de XML avec schemaValidate() en PHP?

Si le fichier xml
$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"; 
} 

est invalide, il dit qu'il est invalide. La raison pour laquelle il est invalide (par exemple, le prix n'est pas un nombre entier), cependant, est donné uniquement dans un avertissement PHP, que je dois supprimer pour que l'utilisateur ne le voit pas (avec error_reporting (0)).

Comment puis-je obtenir le texte de ce message et le transmettre à l'utilisateur, comme je le ferais en C# avec un try/catch?

Répondre

14

Je pense que vous pouvez utiliser les fonctions de gestion des erreurs de libxml pour celui-ci:

Exemple 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 vous avez seulement besoin d'imprimer, vous pouvez définir votre error handler personnalisé pour imprimer l'erreur.

0

voici comment je l'ai fait:

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

descriptions d'erreur sont maintenant dans $ errs, le cas échéant.

Questions connexes