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()undxml_get_current_byte_index()für eine präziseZeile:Spalte-Position.
Diese Funktion ist Teil der prozeduralen Expat-API. Wenn Sie XML stattdessen mit der objektorientierten
XMLReader-Klasse parsen, verwenden Sie derengetLineNo()-Methode.
Syntax
Die Syntax der Funktion xml_get_current_line_number() lautet wie folgt:
xml_get_current_line_number($parser): int|falseParameter
$parser— der mitxml_parser_create()(oderxml_parser_create_ns()) erstellte XML-Parser. In PHP 8+ ist dies einXMLParser-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
xml_get_current_column_number()— die Spalte innerhalb der aktuellen Zeile.xml_get_current_byte_index()— der Byte-Offset im Dokument.xml_get_error_code()undxml_error_string()— wandelt einen Parse-Fehler in eine lesbare Meldung um.xml_set_element_handler()— registriert die in Beispiel 2 verwendeten Start-/End-Tag-Callbacks.
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.