W3docs

libxml_get_errors()

Die Funktion libxml_get_errors() in PHP ruft eine Liste von Fehlern und Warnungen ab, die von libxml-Funktionen erzeugt wurden.

Die Funktion libxml_get_errors() in PHP ruft die Liste der Fehler und Warnungen ab, die von libxml-Funktionen erzeugt wurden — der C-Bibliothek, auf der PHPs DOMDocument-, SimpleXML- und XMLReader-Erweiterungen basieren. Sie wird typischerweise nach dem Parsen oder Validieren eines XML-Dokuments aufgerufen, damit genau nachvollzogen werden kann, was schiefgelaufen ist, anstatt sich auf PHP-Warnungen zu verlassen.

Diese Seite behandelt die Funktionssignatur, die Struktur der zurückgegebenen Fehlerobjekte, ein eigenständiges ausführbares Beispiel, das Lesen von Fehlerschweregraden und die Beziehung zu den anderen libxml-Fehlerfunktionen.

Syntax

libxml_get_errors(): array

Die Funktion nimmt keine Argumente entgegen und gibt ein Array von LibXMLError-Objekten zurück. Sind keine Fehler im Puffer vorhanden, wird ein leeres Array ([]) zurückgegeben.

Was libxml_get_errors() zurückgibt

Jedes Element im zurückgegebenen Array ist ein LibXMLError-Objekt mit folgenden öffentlichen Eigenschaften:

EigenschaftTypBeschreibung
levelintSchweregrad: LIBXML_ERR_NONE (0), LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2) oder LIBXML_ERR_FATAL (3).
codeintDer interne libxml-Fehlercode.
messagestringDie lesbare Fehlermeldung (beachte das abschließende \n).
filestringDer Dateiname oder ein leerer String beim Parsen einer In-Memory-Zeichenkette.
lineintDie Zeilennummer, in der der Fehler aufgetreten ist.
columnintDie Spaltennummer, in der der Fehler aufgetreten ist.

Verwendung von libxml_get_errors()

Es gibt eine Regel, die unbedingt beachtet werden muss: Interne Fehlerbehandlung zuerst aktivieren. Standardmäßig schreibt libxml Parse-Fehler direkt als Warnungen in PHPs Ausgabe, und der Fehlerpuffer bleibt leer. Der Aufruf von libxml_use_internal_errors(true) leitet diese Fehler in einen internen Puffer um, den libxml_get_errors() auslesen kann.

Der typische Arbeitsablauf ist:

  1. libxml_use_internal_errors(true) vor dem Parsen aufrufen.
  2. Das XML parsen oder validieren (mit DOMDocument, SimpleXML usw.).
  3. libxml_get_errors() aufrufen, um die gesammelten Fehler auszulesen.
  4. libxml_clear_errors() aufrufen, um den Puffer für die nächste Operation zu leeren.

Ein eigenständiges, ausführbares Beispiel

Dieses Beispiel lädt fehlerhaftes XML aus einer Zeichenkette (keine externen Dateien erforderlich) und gibt jeden Fehler mit Schweregrad, Zeile und Spalte aus:

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

Ausgabe:

[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

Da das <author>-Tag offen bleibt, meldet libxml zwei fatale Fehler, die jeweils auf die genaue Zeile und Spalte zeigen, an der ein Problem erkannt wurde. Das Auslesen von level, line und column — statt nur message — macht libxml_get_errors() so nützlich für die Erstellung präziser Validierungs-Rückmeldungen.

Validierung gegen ein Schema

Das gleiche Muster funktioniert auch für die Schema-Validierung. Nachdem schemaValidate() / schemaValidateSource() false zurückgibt, warten die Validierungsfehler im Puffer:

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

Tipp: Wird nur das zuletzt aufgetretene Problem benötigt, kann stattdessen libxml_get_last_error() verwendet werden — diese Funktion gibt ein einzelnes LibXMLError-Objekt (oder false) zurück, nicht das gesamte Array.

Häufige Fallstricke

  • Leeres Ergebnis? Wahrscheinlich wurde libxml_use_internal_errors(true) vergessen. Ohne diesen Aufruf wird der Puffer nie befüllt.
  • Veraltete Fehler. Der Puffer wird über alle libxml-Operationen im Request hinweg geteilt. Nach der Verarbeitung eines Batches immer libxml_clear_errors() aufrufen, sonst tauchen ältere Fehler bei einem späteren libxml_get_errors()-Aufruf wieder auf.
  • Warnungen vs. fatale Fehler. Ein nicht leeres Array bedeutet nicht zwangsläufig, dass das Dokument unbrauchbar ist — mit $error->level >= LIBXML_ERR_ERROR filtern, um Warnungen zu ignorieren.

Verwandte Funktionen

Fazit

Die Funktion libxml_get_errors() ist ein unverzichtbares Werkzeug für das Debugging von XML-Operationen in PHP. Durch die Aktivierung der internen Fehlerbehandlung mit libxml_use_internal_errors(true), das Parsen des Dokuments und anschließende Inspektion der Eigenschaften level, line, column und message jedes LibXMLError-Objekts lässt sich eine präzise, benutzerfreundliche XML-Validierung aufbauen, anstatt rohe PHP-Warnungen zu ignorieren. Dabei sollte der Puffer zwischen den Operationen stets mit libxml_clear_errors() geleert werden.

Übungen

Übung
Was ist der Zweck der Funktion libxml_get_errors() in PHP?
Was ist der Zweck der Funktion libxml_get_errors() in PHP?
Was this page helpful?