W3docs

libxml_get_last_error()

Die PHP-Funktion libxml_get_last_error() gibt den letzten von libxml erzeugten Fehler zurück.

Die Funktion libxml_get_last_error() in PHP ruft den letzten Fehler ab, der von der libxml-Bibliothek erzeugt wurde — dem Parser, der PHPs DOMDocument-, SimpleXML- und XMLReader-Erweiterungen antreibt. Wenn Sie fehlerhaftes XML parsen oder validieren, zeichnet libxml auf, was schiefgelaufen ist; diese Funktion ermöglicht es Ihnen, den aktuellsten Eintrag auszulesen, damit Sie eine aussagekräftige Nachricht anstelle einer kryptischen Warnung anzeigen können.

Diese Seite behandelt den Rückgabewert der Funktion, die Fehlererfassung mit libxml_use_internal_errors(), die Eigenschaften des Fehlerobjekts und wann Sie libxml_get_last_error() gegenüber den verwandten Funktionen bevorzugen sollten.

Syntax

libxml_get_last_error(): LibXMLError|false

Die Funktion erwartet keine Argumente. Sie gibt zurück:

  • Ein LibXMLError-Objekt, das den aktuellsten Fehler beschreibt, oder
  • false, wenn seit dem letzten Aufruf von libxml_clear_errors() kein Fehler aufgezeichnet wurde.

Warum Sie sie benötigen

Standardmäßig gibt libxml Fehler als PHP-Warnungen aus, die Ihre Ausgabe überladen und schwer programmatisch zu behandeln sind. Das übliche Muster lautet:

  1. Rufen Sie libxml_use_internal_errors(true) auf, um die Warnungen zu unterdrücken und Fehler stattdessen in einem internen Puffer zu speichern.
  2. Parsen oder validieren Sie Ihr XML.
  3. Lesen Sie den Puffer mit libxml_get_last_error() (nur der aktuellste) oder libxml_get_errors() (alle davon).
  4. Leeren Sie den Puffer mit libxml_clear_errors(), damit der nächste Vorgang sauber beginnt.

Verwenden Sie libxml_get_last_error(), wenn Sie nur wissen möchten, was gerade fehlgeschlagen ist — beispielsweise um zu berichten, warum ein einzelner Parse-Aufruf nicht erfolgreich war.

Das LibXMLError-Objekt

Das zurückgegebene Objekt stellt diese öffentlichen Eigenschaften bereit:

EigenschaftBeschreibung
levelSchweregrad: LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2) oder LIBXML_ERR_FATAL (3).
codeDer libxml-Fehlercode (eine Ganzzahl).
messageEine für Menschen lesbare Beschreibung des Fehlers.
fileDie Datei, die den Fehler ausgelöst hat, oder ein leerer string beim Parsen eines Strings.
lineDie Zeilennummer, in der der Fehler aufgetreten ist.
columnDie Spaltennummer, in der der Fehler aufgetreten ist.

Beispiel: Einen Parse-Fehler abfangen

Dieses Beispiel parst einen absichtlich fehlerhaften XML-string (ein fehlendes schließendes Tag) und gibt den erfassten Fehler aus. Es ist vollständig in sich geschlossen — keine externe Datei wird benötigt:

<?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();
?>

Ausgabe:

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

Der genaue code, column und Wortlaut der Nachricht hängen von Ihrer libxml-Version ab, aber die Struktur ist stets dieselbe. level ist 3 (LIBXML_ERR_FATAL), weil das nicht geschlossene Tag das Dokument nicht parsebar macht. (code wird in der obigen Ausgabe weggelassen, da sein Wert versionsspezifisch ist.)

Beispiel: Gegen ein Schema validieren

Ein häufiger Praxisfall ist die Meldung, warum ein Dokument die Schema-Validierung nicht bestanden hat:

<?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();
?>

Hier prüfen wir den Rückgabewert von libxml_get_last_error() gegen false, bevor wir auf $error->message zugreifen — das Zugreifen auf eine Eigenschaft von false würde eine eigene Warnung auslösen.

Häufige Fallstricke

  • Sie müssen zuerst die interne Fehlerbehandlung aktivieren. Ohne libxml_use_internal_errors(true) gibt libxml Warnungen aus und der interne Puffer bleibt leer, sodass libxml_get_last_error() false zurückgibt.
  • Leeren Sie den Puffer zwischen Operationen. Fehler häufen sich an. Wenn Sie libxml_clear_errors() nicht aufrufen, gibt ein späterer Aufruf von libxml_get_last_error() möglicherweise einen veralteten Fehler aus einem früheren Parse-Vorgang zurück.
  • "Letzter" bedeutet letzter, nicht "dieser Aufruf". Die Funktion gibt zurück, was am Ende des Puffers steht, unabhängig davon, welcher Parse-Vorgang ihn erzeugt hat.

Verwandte Funktionen

Für einen breiteren Kontext zum Parsen von XML in PHP, siehe Das XML DOM in PHP und SimpleXML.

Fazit

libxml_get_last_error() ermöglicht Ihnen programmatischen Zugriff auf den aktuellsten XML-Parse- oder Validierungsfehler und wandelt stille Fehler und laute Warnungen in handlungsrelevante Nachrichten um. Kombinieren Sie es mit libxml_use_internal_errors() zum Erfassen von Fehlern und libxml_clear_errors() zum Zurücksetzen des Puffers, und verwenden Sie libxml_get_errors(), wenn Sie die vollständige Liste und nicht nur den neuesten Eintrag benötigen.

Practice

Übung
Was macht die Funktion libxml_get_last_error() in PHP?
Was macht die Funktion libxml_get_last_error() in PHP?
Was this page helpful?