libxml_get_errors()
Découvrez la fonction libxml_get_errors() en PHP, qui permet de récupérer les erreurs générées par les fonctions libxml lors du traitement XML.
La fonction libxml_get_errors() en PHP récupère la liste des erreurs et avertissements générés par les fonctions libxml — la bibliothèque C qui alimente les extensions DOMDocument, SimpleXML et XMLReader de PHP. Elle est généralement appelée après l'analyse ou la validation d'un document XML afin d'inspecter exactement ce qui s'est mal passé, plutôt que de se fier aux avertissements PHP.
Cette page couvre la signature de la fonction, la structure des objets d'erreur qu'elle retourne, un exemple exécutable autonome, comment interpréter les niveaux de sévérité des erreurs, et comment elle se rapporte aux autres fonctions d'erreur libxml.
Syntaxe
libxml_get_errors(): arrayElle ne prend aucun argument et retourne un tableau d'objets LibXMLError. Si aucune erreur ne se trouve dans le tampon, elle retourne un tableau vide ([]).
Ce que retourne libxml_get_errors()
Chaque élément du tableau retourné est un objet LibXMLError avec ces propriétés publiques :
| Propriété | Type | Description |
|---|---|---|
level | int | Sévérité : LIBXML_ERR_NONE (0), LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2), ou LIBXML_ERR_FATAL (3). |
code | int | Le code d'erreur interne libxml. |
message | string | Le message d'erreur lisible par l'humain (notez le \n final). |
file | string | Le nom de fichier, ou une chaîne vide lors de l'analyse d'une chaîne en mémoire. |
line | int | Le numéro de ligne où l'erreur s'est produite. |
column | int | Le numéro de colonne où l'erreur s'est produite. |
Comment utiliser libxml_get_errors()
Il y a une règle à respecter : activez d'abord la gestion interne des erreurs. Par défaut, libxml écrit les erreurs d'analyse directement dans la sortie PHP sous forme d'avertissements, et le tampon d'erreurs reste vide. Appeler libxml_use_internal_errors(true) redirige ces erreurs vers un tampon interne que libxml_get_errors() peut lire.
Le flux de travail typique est le suivant :
- Appelez
libxml_use_internal_errors(true)avant l'analyse. - Analysez ou validez le XML (avec
DOMDocument,SimpleXML, etc.). - Appelez
libxml_get_errors()pour lire les erreurs collectées. - Appelez
libxml_clear_errors()pour vider le tampon avant la prochaine opération.
Un exemple autonome et exécutable
Cet exemple charge du XML malformé depuis une chaîne (sans fichiers externes) et affiche chaque erreur avec sa sévérité, sa ligne et sa colonne :
<?php
// 1. Capture errors in the internal buffer instead of emitting warnings
libxml_use_internal_errors(true);
// Intentionally broken XML: <author> is never closed
$xml = <<<XML
<book>
<title>PHP Basics</title>
<author>Jane Doe
</book>
XML;
// 2. Parse it
$doc = new DOMDocument();
$doc->loadXML($xml);
// 3. Read the errors
$errors = libxml_get_errors();
// Map numeric levels to readable labels
$levels = [
LIBXML_ERR_WARNING => 'Warning',
LIBXML_ERR_ERROR => 'Error',
LIBXML_ERR_FATAL => 'Fatal',
];
foreach ($errors as $error) {
printf(
"[%s] line %d, col %d: %s",
$levels[$error->level] ?? 'Unknown',
$error->line,
$error->column,
$error->message // already ends with a newline
);
}
// 4. Clear the buffer so it doesn't leak into later parsing
libxml_clear_errors();
?>Sortie :
[Fatal] line 4, col 8: Opening and ending tag mismatch: author line 3 and book
[Fatal] line 4, col 8: Premature end of data in tag book line 1Étant donné que la balise <author> est laissée ouverte, libxml signale deux erreurs fatales, chacune pointant vers la ligne et la colonne exactes où le problème a été détecté. Lire level, line et column — plutôt que simplement message — est ce qui rend libxml_get_errors() si utile pour construire un retour de validation précis.
Validation par rapport à un schéma
Le même schéma fonctionne pour la validation par schéma. Après que schemaValidate() / schemaValidateSource() retourne false, les erreurs de validation attendent dans le tampon :
<?php
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->load('example.xml');
// schemaValidateSource() validates against an in-memory XSD string
$xsd = file_get_contents('example.xsd');
if ($doc->schemaValidateSource($xsd)) {
echo "The XML document is valid.\n";
} else {
echo "The XML document is not valid:\n";
foreach (libxml_get_errors() as $error) {
echo trim($error->message) . "\n";
}
}
libxml_clear_errors();
?>Conseil : Si vous n'avez besoin que du dernier problème en date, utilisez plutôt
libxml_get_last_error()— il retourne un seul objetLibXMLError(oufalse) plutôt que le tableau entier.
Pièges courants
- Résultat vide ? Vous avez très certainement oublié
libxml_use_internal_errors(true). Sans cela, le tampon n'est jamais alimenté. - Erreurs périmées. Le tampon est partagé entre toutes les opérations libxml de la requête. Appelez toujours
libxml_clear_errors()après avoir traité un lot, sinon les erreurs antérieures réapparaîtront lors d'un prochain appel àlibxml_get_errors(). - Avertissements vs. erreurs fatales. Un tableau non vide ne signifie pas nécessairement que le document est inutilisable — filtrez sur
$error->level >= LIBXML_ERR_ERRORsi vous souhaitez ignorer les avertissements.
Fonctions associées
libxml_use_internal_errors()— activer ou désactiver le tampon d'erreurs.libxml_get_last_error()— récupérer uniquement l'erreur la plus récente.libxml_clear_errors()— vider le tampon d'erreurs.- Vue d'ensemble de PHP libxml — l'extension plus large à laquelle ces fonctions appartiennent.
- PHP XML DOM — analyser des documents avec
DOMDocument.
Conclusion
La fonction libxml_get_errors() est un outil essentiel pour déboguer les opérations XML en PHP. En activant la gestion interne des erreurs avec libxml_use_internal_errors(true), en analysant votre document, puis en inspectant les propriétés level, line, column et message de chaque objet LibXMLError, vous pouvez construire une validation XML précise et conviviale plutôt que de vous noyer dans des avertissements PHP bruts. N'oubliez pas de vider le tampon avec libxml_clear_errors() entre les opérations.