W3docs

xml_get_current_line_number()

Die Funktion xml_get_current_line_number() ist eine in PHP eingebaute Funktion, die die aktuelle Zeilennummer eines XML-Parsers abruft.

Die Funktion xml_get_current_line_number() ist eine in PHP eingebaute Funktion, die die aktuelle Zeilennummer eines XML-Parsers abruft. Sie gehört zur prozeduralen XML-Parser-(Expat-)Erweiterung und wird beim Parsen von XML mit den SAX-artigen xml_parse*-Funktionen verwendet. Die aktuelle Zeilennummer zu kennen ist nützlich für Debugging, Fehlerberichterstattung und das Verfolgen des Parsing-Fortschritts.

Diese Seite behandelt die Syntax der Funktion, ihren Rückgabewert und praktische Beispiele – sowohl bei einem einmaligen Parse-Aufruf als auch innerhalb eines live SAX-Ereignis-Handlers.

Wann man sie verwendet

Rufen Sie xml_get_current_line_number() immer dann auf, wenn Sie die Position des Parsers im Quelldokument benötigen, typischerweise:

  • Fehlerberichterstattung – wenn ein Ereignis-Handler oder xml_get_error_code() ein Problem meldet, teilt die Zeilennummer dem Benutzer mit, wo in der Datei es aufgetreten ist.
  • Fortschritt verfolgen – gibt aus, welche Zeile gerade beim Parsen einer großen XML-Datei verarbeitet wird.
  • Diagnose – kombinieren Sie es mit xml_get_current_column_number() und xml_get_current_byte_index() für eine präzise Zeile:Spalte-Position.

Diese Funktion ist Teil der prozeduralen Expat-API. Wenn Sie XML stattdessen mit der objektorientierten XMLReader-Klasse parsen, verwenden Sie deren getLineNo()-Methode.

Syntax

Die Syntax der Funktion xml_get_current_line_number() lautet wie folgt:

xml_get_current_line_number($parser): int|false

Parameter

  • $parser — der mit xml_parser_create() (oder xml_parser_create_ns()) erstellte XML-Parser. In PHP 8+ ist dies ein XMLParser-Objekt; in PHP 7 und früher ist es eine Ressource.

Rückgabewert

Gibt die aktuelle Zeilennummer zurück (ein int, beginnend bei Zeile 1), während der Parser das Dokument liest. Es wird false zurückgegeben, wenn $parser kein gültiger Parser ist. Während des Parsens spiegelt der Wert die Zeile der Daten wider, die der Parser erreicht hat – er ist daher am aussagekräftigsten, wenn er innerhalb eines Ereignis-Handlers gelesen wird.

Verwendungsbeispiele

Werfen wir einen Blick auf einige praktische Beispiele zur Verwendung von xml_get_current_line_number() in PHP.

Beispiel 1: Aktuelle Zeilennummer eines XML-Parsers abrufen

Angenommen, Sie haben eine XML-Datei data.xml, die Sie mit der XML-Parser-Erweiterung in PHP parsen möchten. Sie können die Funktion xml_get_current_line_number() verwenden, um die nach dem Parsen erreichte Zeilennummer abzurufen, wie folgt:

$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_parse_into_struct($xml_parser, file_get_contents("data.xml"), $values);
$current_line_number = xml_get_current_line_number($xml_parser);
echo "Current Line Number: $current_line_number";
xml_parser_free($xml_parser);

Dieser Code erstellt einen XML-Parser mit xml_parser_create() und setzt eine Option, um die Groß-/Kleinschreibungsanpassung zu deaktivieren. Anschließend wird xml_parse_into_struct() verwendet, um die XML-Datei data.xml zu parsen und das Ergebnis in einem Array $values zu speichern. Die aktuelle Zeilennummer wird mit xml_get_current_line_number() abgerufen, die die Zeilennummer des zuletzt geparsten Elements zurückgibt, und auf der Konsole ausgegeben. Schließlich wird der vom XML-Parser belegte Speicher mit xml_parser_free() freigegeben.

Beispiel 2: Zeilennummern während des SAX-Parsens verfolgen

Angenommen, Sie möchten die Zeilennummer jedes Elements verfolgen, während es mit einem SAX-Ereignis-Handler geparst wird. Sie können xml_set_element_handler() zusammen mit xml_get_current_line_number() verwenden, um die Position des Parsers in Echtzeit zu überwachen, wie folgt:

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, function($parser, $name, $attrs) {
    $line = xml_get_current_line_number($parser);
    echo "Element <$name> found at line $line\n";
}, function($parser, $name) {
    // end element handler
});
$xml_data = file_get_contents("data.xml");
xml_parse($xml_parser, $xml_data, true);
xml_parser_free($xml_parser);

Dieser Code erstellt einen XML-Parser mit xml_parser_create() und registriert einen Elementhandler mit xml_set_element_handler(). Anschließend wird xml_parse() verwendet, um die XML-Datei data.xml zu parsen. Jedes Mal, wenn ein Start-Tag erkannt wird, ruft der Handler die aktuelle Zeilennummer mit xml_get_current_line_number() ab und gibt den Elementnamen zusammen mit seiner Zeilenposition aus. Schließlich wird der Parser mit xml_parser_free() freigegeben. Da die Zeilennummer während des Callbacks gelesen wird, spiegelt sie die tatsächliche Position jedes Elements wider – anders als in Beispiel 1, wo der Wert nur den Endzustand nach dem Parsen des gesamten Dokuments widerspiegelt.

Häufige Fehlerquelle

xml_get_current_line_number() ist nur während des laufenden Parsens aussagekräftig, was in der Praxis bedeutet, innerhalb eines Ereignis-Handlers. Wenn Sie sie nach Abschluss von xml_parse() aufrufen (wie in Beispiel 1), erhalten Sie die Zeile des zuletzt verarbeiteten Bytes, nicht die Zeile eines bestimmten Elements. Für elementspezifische Positionen sollten Sie sie stets innerhalb des Handlers lesen, wie in Beispiel 2 gezeigt.

Verwandte Funktionen

Fazit

In diesem Artikel haben wir die PHP-Funktion xml_get_current_line_number() besprochen und erläutert, wie sie die aktuelle Zeilennummer eines XML-Parsers abruft. Wir haben erklärt, was die Funktion tut, ihre Syntax und ihren Rückgabewert, und sie sowohl bei einem einmaligen Parse-Aufruf als auch in einem live SAX-Handler gezeigt. Indem Sie die Zeilennummer innerhalb Ihrer Ereignis-Handler lesen, können Sie Elemente im Quelldokument für Debugging, Fehlerberichterstattung und Fortschrittsverfolgung präzise lokalisieren.

Übung

Übung
Wie erhält man in der prozeduralen XML-Parser-(Expat-)Erweiterung die Zeile, auf der sich der Parser aktuell befindet?
Wie erhält man in der prozeduralen XML-Parser-(Expat-)Erweiterung die Zeile, auf der sich der Parser aktuell befindet?
Was this page helpful?