W3docs

libxml_get_last_error()

Découvrez la fonction libxml_get_last_error() en PHP pour récupérer la dernière erreur générée par la bibliothèque libxml lors de l'analyse XML.

La fonction libxml_get_last_error() en PHP récupère la dernière erreur générée par la bibliothèque libxml — l'analyseur qui alimente les extensions DOMDocument, SimpleXML et XMLReader de PHP. Lorsque vous analysez ou validez du XML mal formé, libxml enregistre ce qui s'est passé ; cette fonction vous permet de lire l'enregistrement le plus récent afin d'afficher un message utile plutôt qu'un avertissement cryptique.

Cette page couvre ce que la fonction retourne, comment capturer les erreurs avec libxml_use_internal_errors(), les propriétés de l'objet d'erreur, et quand utiliser libxml_get_last_error() plutôt que les fonctions associées.

Syntaxe

libxml_get_last_error(): LibXMLError|false

La fonction ne prend aucun argument. Elle retourne :

  • Un objet LibXMLError décrivant l'erreur la plus récente, ou
  • false si aucune erreur n'a été enregistrée depuis le dernier appel à libxml_clear_errors().

Pourquoi en avez-vous besoin

Par défaut, libxml émet les erreurs sous forme d'avertissements PHP, ce qui encombre la sortie et est difficile à gérer par programmation. Le schéma habituel est le suivant :

  1. Appeler libxml_use_internal_errors(true) pour supprimer les avertissements et stocker les erreurs dans un tampon interne.
  2. Analyser ou valider votre XML.
  3. Lire le tampon avec libxml_get_last_error() (la plus récente uniquement) ou libxml_get_errors() (toutes).
  4. Vider le tampon avec libxml_clear_errors() afin que l'opération suivante commence à l'état propre.

Utilisez libxml_get_last_error() lorsque vous vous intéressez uniquement à ce qui vient d'échouer — par exemple, signaler pourquoi un seul appel d'analyse n'a pas réussi.

L'objet LibXMLError

L'objet retourné expose ces propriétés publiques :

PropriétéDescription
levelGravité : LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2), ou LIBXML_ERR_FATAL (3).
codeLe code d'erreur libxml (un entier).
messageUne description lisible de l'erreur.
fileLe fichier qui a déclenché l'erreur, ou une chaîne vide lors de l'analyse d'une chaîne.
lineLe numéro de ligne où l'erreur s'est produite.
columnLe numéro de colonne où l'erreur s'est produite.

Exemple : capture d'une erreur d'analyse

Cet exemple analyse une chaîne XML intentionnellement mal formée (une balise de fermeture manquante), puis affiche l'erreur capturée. Il est entièrement autonome — aucun fichier externe n'est nécessaire :

<?php
// Store libxml errors in an internal buffer instead of emitting warnings
libxml_use_internal_errors(true);

// This XML is malformed: <title> is never closed
$badXml = '<book><title>PHP</book>';

$doc = new DOMDocument();
$doc->loadXML($badXml);

$error = libxml_get_last_error();

if ($error !== false) {
    echo "Error level:  " . $error->level   . PHP_EOL;
    echo "Error code:   " . $error->code    . PHP_EOL;
    echo "Line:         " . $error->line     . PHP_EOL;
    echo "Message:      " . trim($error->message) . PHP_EOL;
} else {
    echo "The XML parsed without errors." . PHP_EOL;
}

// Always clear the buffer when you are done with it
libxml_clear_errors();
?>

Sortie :

Error level:  3
Line:         1
Message:      Premature end of data in tag book line 1

Le code, la column et le libellé du message exacts dépendent de votre version de libxml, mais la structure est toujours la même. level vaut 3 (LIBXML_ERR_FATAL) car la balise non fermée rend le document non analysable. (code est omis de la sortie ci-dessus uniquement parce que sa valeur est spécifique à la version.)

Exemple : validation par rapport à un schéma

Un cas d'utilisation réel courant consiste à signaler pourquoi un document n'a pas réussi la validation de schéma :

<?php
libxml_use_internal_errors(true);

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

if ($doc->schemaValidate('example.xsd')) {
    echo "The XML document is valid.";
} else {
    $error = libxml_get_last_error();
    if ($error !== false) {
        echo "Validation failed: " . trim($error->message);
    }
}

libxml_clear_errors();
?>

Ici, nous vérifions la valeur de retour de libxml_get_last_error() par rapport à false avant d'accéder à $error->message — accéder à une propriété sur false déclencherait son propre avertissement.

Pièges courants

  • Vous devez d'abord activer la gestion interne des erreurs. Sans libxml_use_internal_errors(true), libxml affiche des avertissements et le tampon interne reste vide, donc libxml_get_last_error() retourne false.
  • Videz le tampon entre les opérations. Les erreurs s'accumulent. Si vous n'appelez pas libxml_clear_errors(), un appel ultérieur à libxml_get_last_error() peut retourner une erreur obsolète d'une analyse précédente.
  • "Dernier" signifie dernier, pas "cet appel". La fonction retourne ce qui se trouve à la fin du tampon, quelle que soit l'analyse qui l'a produit.

Fonctions associées

Pour un contexte plus large sur l'analyse XML en PHP, consultez The XML DOM in PHP et SimpleXML.

Conclusion

libxml_get_last_error() vous donne un accès programmatique à l'erreur d'analyse ou de validation XML la plus récente, transformant les échecs silencieux et les avertissements bruyants en messages exploitables. Associez-la à libxml_use_internal_errors() pour capturer les erreurs et à libxml_clear_errors() pour réinitialiser le tampon, et utilisez libxml_get_errors() lorsque vous avez besoin de la liste complète plutôt que du seul dernier élément.

Pratique

Pratique
Que fait la fonction libxml_get_last_error() en PHP ?
Que fait la fonction libxml_get_last_error() en PHP ?
Was this page helpful?