Start · Sprachen · PHP · Referenz · libxml_get_errors

libxml_get_errors

Funktion

Gibt ein Array aller aufgetretenen <code>LibXMLError</code>-Objekte aus dem internen libxml-Fehlerpuffer zurück.

seit PHP 5.1.0 Kategorie: xml

Signatur

libxml_get_errors(): array

Beschreibung

libxml_get_errors() liest alle seit dem letzten Aufruf von libxml_clear_errors() (oder seit Programmstart) gesammelten Fehler, Warnungen und Hinweise als Array von LibXMLError-Objekten aus. Jedes Objekt enthält die Eigenschaften level, code, column, message, file und line.

Damit die Funktion nützlich ist, muss die interne Fehlerbehandlung von libxml zuvor mit libxml_use_internal_errors(true) aktiviert werden. Andernfalls werden Fehler direkt als PHP-Warnings ausgegeben und landen nicht im Puffer.

Typische Einsatzgebiete sind das Validieren von XML- oder HTML-Dokumenten mit DOMDocument::loadXML(), DOMDocument::loadHTMLFile() oder SimpleXML-Funktionen, wenn man Fehler strukturiert auswerten oder protokollieren möchte, anstatt sie unkontrolliert auf dem Bildschirm erscheinen zu lassen.

Nach der Auswertung sollte der Puffer mit libxml_clear_errors() geleert werden, damit alte Fehler nachfolgende Prüfungen nicht verfälschen.

Rückgabewert

Typ
array
Beschreibung
Gibt ein (möglicherweise leeres) Array von LibXMLError-Objekten zurück. Jedes Objekt hat die Felder: level (Schweregrad: LIBXML_ERR_WARNING, LIBXML_ERR_ERROR, LIBXML_ERR_FATAL), code (numerischer Fehlercode), message (Fehlermeldung), file (Dateiname oder leer), line (Zeilennummer) und column (Spaltennummer).

Beispiele

Fehler beim Laden von fehlerhaftem XML auflisten

<?php
libxml_use_internal_errors(true);

$xml = simplexml_load_string('<root><unclosed></root>');

if ($xml === false) {
    echo "XML konnte nicht geparst werden. Fehler:" . PHP_EOL;
    foreach (libxml_get_errors() as $error) {
        $level = match ($error->level) {
            LIBXML_ERR_WARNING => 'Warnung',
            LIBXML_ERR_ERROR   => 'Fehler',
            LIBXML_ERR_FATAL   => 'Fataler Fehler',
            default            => 'Unbekannt',
        };
        printf(
            "[%s] Zeile %d, Spalte %d: %s\n",
            $level,
            $error->line,
            $error->column,
            trim($error->message)
        );
    }
    libxml_clear_errors();
} else {
    echo "XML erfolgreich geladen." . PHP_EOL;
}
XML konnte nicht geparst werden. Fehler: [Fataler Fehler] Zeile 1, Spalte 22: Opening and ending tag mismatch: unclosed line 1 and root [Fataler Fehler] Zeile 1, Spalte 29: Extra content at the end of the document

HTML mit DOMDocument laden und Fehler sammeln

<?php
libxml_use_internal_errors(true);

$dom = new DOMDocument();
$dom->loadHTML('<html><body><p>Nicht geschlossen<div>Hier</div></body></html>');

$errors = libxml_get_errors();
if (!empty($errors)) {
    echo count($errors) . ' Fehler/Warnungen gefunden:' . PHP_EOL;
    foreach ($errors as $error) {
        echo '- ' . trim($error->message) . ' (Zeile ' . $error->line . ')' . PHP_EOL;
    }
} else {
    echo 'Keine Fehler.' . PHP_EOL;
}

libxml_clear_errors();
1 Fehler/Warnungen gefunden: - Tag p implicitly closed (Zeile 1)

// Wichtig · Fallstricke

Wichtig: Ohne vorherigen Aufruf von libxml_use_internal_errors(true) bleibt der Puffer stets leer, da Fehler nicht gesammelt, sondern direkt als PHP-Notices/Warnings ausgegeben werden.

Der Fehlerpuffer ist global und wird über mehrere Ladevorgänge hinweg angesammelt. Es empfiehlt sich daher, libxml_clear_errors() stets nach der Auswertung aufzurufen, um Fehler aus unterschiedlichen Parsing-Vorgängen nicht zu vermischen.

Der Schweregrad LIBXML_ERR_FATAL bedeutet, dass das Dokument nicht korrekt verarbeitet werden konnte; LIBXML_ERR_WARNING und LIBXML_ERR_ERROR können je nach Kontext noch ein brauchbares Ergebnis liefern.