W3docs

libxml_use_internal_errors()

Erfahren Sie, wie die PHP-Funktion libxml_use_internal_errors() die interne Fehlerbehandlung von libxml aktiviert oder deaktiviert.

Die Funktion libxml_use_internal_errors() ermöglicht es Ihnen, den libxml-basierten PHP-Erweiterungen (DOM, SimpleXML, XMLReader, XMLWriter) mitzuteilen, dass sie keine Warnungen mehr auf dem Bildschirm ausgeben, sondern diese stattdessen in einem internen Puffer sammeln sollen, den Sie in Ihrem eigenen Code auswerten können.

Diese Seite erklärt, was die Funktion tut, ihre Signatur und ihren Rückgabewert sowie wie man sie mit dem übrigen libxml-Fehler-API kombiniert, um fehlerhaftes XML elegant zu verarbeiten.

Warum interne Fehlerbehandlung verwenden?

Standardmäßig löst libxml beim Auftreten von fehlerhaftigem XML PHP-Warnungen aus. In einer Web-Applikation werden diese Warnungen entweder in der Ausgabe angezeigt oder stillschweigend unterdrückt, je nach Ihren display_errors/error_reporting-Einstellungen – und Sie haben keine strukturierte Möglichkeit, darauf zu reagieren.

Der Aufruf von libxml_use_internal_errors(true) ändert das:

  • Das Parsen gibt keine PHP-Warnungen mehr aus. Ihr Skript läuft weiter.
  • Jedes Problem wird als LibXMLError-Objekt in einen internen Puffer geschrieben.
  • Sie entscheiden, was zu tun ist – protokollieren, eine benutzerfreundliche Meldung anzeigen, abbrechen oder nicht-fatale Probleme ignorieren.

Dies ist das Standardmuster für das Parsen von XML, das Sie nicht kontrollieren (Benutzer-Uploads, Drittanbieter-Feeds, gescraptes HTML).

Syntax

libxml_use_internal_errors(?bool $use_errors = null): bool
  • $use_errors — übergeben Sie true, um die interne Fehlerbehandlung zu aktivieren, false, um sie zu deaktivieren. Übergeben Sie null (oder lassen Sie das Argument weg), um den aktuellen Zustand abzufragen, ohne ihn zu ändern.
  • Rückgabewert — die Funktion gibt die vorherige Einstellung zurück (ein bool). Dadurch können Sie den alten Zustand wiederherstellen, wenn Sie fertig sind, sodass Sie nicht verwandten Code beeinflussen.

Verwendung von libxml_use_internal_errors()

Aktivieren Sie die internen Fehler, parsen Sie das Dokument, lesen Sie dann den Puffer mit libxml_get_errors() und leeren Sie ihn mit libxml_clear_errors().

Das folgende Beispiel parst fehlerhaftes XML direkt im Code (keine externe Datei erforderlich, sodass Sie es direkt ausführen können):

<?php
// 1. Route libxml warnings into the internal buffer.
libxml_use_internal_errors(true);

// 2. Deliberately broken XML: <from> is never closed.
$xml = <<<XML
<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani
</note>
XML;

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

// 3. Inspect what went wrong.
foreach (libxml_get_errors() as $error) {
    echo trim($error->message) . " (line {$error->line})\n";
}

// 4. Empty the buffer so later parses start clean.
libxml_clear_errors();
?>

Ausgabe:

Opening and ending tag mismatch: from line 4 and note (line 5)
Premature end of data in tag note line 2 (line 5)

Beachten Sie, dass keine PHP-Warnung ausgegeben wurde – das fehlerhafte Dokument erzeugte stattdessen zwei strukturierte Fehlerobjekte.

Ein LibXMLError-Objekt auslesen

Jedes Element, das von libxml_get_errors() (oder libxml_get_last_error()) zurückgegeben wird, ist ein LibXMLError-Objekt mit nützlichen Feldern:

EigenschaftBedeutung
levelSchweregrad: LIBXML_ERR_WARNING, LIBXML_ERR_ERROR, LIBXML_ERR_FATAL
codeNumerischer libxml-Fehlercode
messageMenschenlesbare Beschreibung (enthält oft einen abschließenden Zeilenumbruch)
lineZeilennummer in der Quelle
columnSpaltennummer
fileDateiname oder leerer string beim Parsen einer Zeichenkette

Sie können level verwenden, um harmlose Warnungen zu ignorieren und trotzdem bei fatalen Fehlern abzubrechen:

<?php
libxml_use_internal_errors(true);

$doc = new DOMDocument();
$doc->loadXML('<a><b></a>'); // mismatched tags → fatal

$error = libxml_get_last_error();

if ($error && $error->level === LIBXML_ERR_FATAL) {
    echo "Fatal parse error (code {$error->code})\n";
}
?>

Ausgabe:

Fatal parse error (code 77)

Den vorherigen Zustand wiederherstellen

Da die Funktion die vorherige Einstellung zurückgibt, sollte eine Bibliothek, die die internen Fehler aktiviert, diese danach wieder zurücksetzen, um das Verhalten für den Rest der Anwendung nicht zu verändern:

<?php
$previous = libxml_use_internal_errors(true);

// ... parse XML and handle libxml_get_errors() ...

libxml_clear_errors();
libxml_use_internal_errors($previous); // restore whatever the caller had
?>

Häufige Fallstricke

  • Der Puffer ist global und persistent. Fehler sammeln sich an, bis Sie libxml_clear_errors() aufrufen (oder der Request endet). Leeren Sie ihn immer zwischen den Parsvorgängen, sonst lesen Sie veraltete Fehler erneut.
  • Er betrifft auch das Laden von HTML. DOMDocument::loadHTML() meldet ungültige Markup über denselben Mechanismus – praktisch beim Scrapen von unvollkommenem HTML ohne Warnungen.
  • Deaktivieren reaktiviert PHP-Warnungen. Der Aufruf von libxml_use_internal_errors(false) versetzt libxml zurück in sein Standardverhalten, Warnungen/Hinweise auszugeben.

Fazit

libxml_use_internal_errors() ist der Einstiegspunkt für robuste XML-Verarbeitung in PHP: Aktivieren Sie es, um die Standard-Warnungen von libxml zu unterdrücken, und verwenden Sie dann libxml_get_errors(), libxml_get_last_error() und libxml_clear_errors(), um Probleme nach Ihren eigenen Vorstellungen zu untersuchen und zu verwalten. Merken Sie sich den Rückgabewert, damit Sie den vorherigen Zustand wiederherstellen können, und leeren Sie den Puffer immer zwischen den Parsvorgängen.

Übungen

Übung
Was sind die Zwecke der Funktion 'libxml_use_internal_errors' in PHP?
Was sind die Zwecke der Funktion 'libxml_use_internal_errors' in PHP?
Was this page helpful?