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|falseDie Funktion erwartet keine Argumente. Sie gibt zurück:
- Ein
LibXMLError-Objekt, das den aktuellsten Fehler beschreibt, oder false, wenn seit dem letzten Aufruf vonlibxml_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:
- Rufen Sie
libxml_use_internal_errors(true)auf, um die Warnungen zu unterdrücken und Fehler stattdessen in einem internen Puffer zu speichern. - Parsen oder validieren Sie Ihr XML.
- Lesen Sie den Puffer mit
libxml_get_last_error()(nur der aktuellste) oderlibxml_get_errors()(alle davon). - 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:
| Eigenschaft | Beschreibung |
|---|---|
level | Schweregrad: LIBXML_ERR_WARNING (1), LIBXML_ERR_ERROR (2) oder LIBXML_ERR_FATAL (3). |
code | Der libxml-Fehlercode (eine Ganzzahl). |
message | Eine für Menschen lesbare Beschreibung des Fehlers. |
file | Die Datei, die den Fehler ausgelöst hat, oder ein leerer string beim Parsen eines Strings. |
line | Die Zeilennummer, in der der Fehler aufgetreten ist. |
column | Die 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 1Der genaue
code,columnund Wortlaut der Nachricht hängen von Ihrer libxml-Version ab, aber die Struktur ist stets dieselbe.levelist3(LIBXML_ERR_FATAL), weil das nicht geschlossene Tag das Dokument nicht parsebar macht. (codewird 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, sodasslibxml_get_last_error()falsezurückgibt. - Leeren Sie den Puffer zwischen Operationen. Fehler häufen sich an. Wenn Sie
libxml_clear_errors()nicht aufrufen, gibt ein späterer Aufruf vonlibxml_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
libxml_get_errors()— gibt ein array aller gepufferten Fehler zurück, nicht nur den aktuellsten.libxml_clear_errors()— leert den Fehlerpuffer.libxml_use_internal_errors()— schaltet um, ob Fehler gepuffert oder als Warnungen ausgegeben werden.
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.