Start · Sprachen · PHP · Referenz · xml_get_current_line_number

xml_get_current_line_number

Funktion

Gibt die aktuelle Zeilennummer zurück, an der sich der XML-Parser im verarbeiteten Dokument befindet.

seit PHP 4.0.0 Kategorie: xml

Signatur

xml_get_current_line_number(XMLParser $parser): int|false

Beschreibung

xml_get_current_line_number() liefert die Zeilennummer innerhalb des XML-Dokuments, die der Parser zuletzt verarbeitet hat. Diese Information ist besonders nützlich beim Debuggen: Tritt ein Fehler auf, kann damit präzise angegeben werden, in welcher Zeile des Eingabedokuments das Problem auftrat.

Die Funktion wird typischerweise zusammen mit xml_get_error_code() und xml_error_string() verwendet, um aussagekräftige Fehlermeldungen zu erzeugen. Sie kann auch innerhalb von Handler-Callbacks aufgerufen werden, um den Fortschritt der Verarbeitung zu verfolgen.

Die Zeilenzählung beginnt bei 1. Jedes Zeilenumbruchzeichen (\n) im verarbeiteten Input erhöht den Zähler um 1. Bei mehrteiligem Parsing mit mehreren xml_parse()-Aufrufen wird der Zähler über alle Aufrufe hinweg kumuliert weitergeführt.

Parameter

Name Typ Default Beschreibung
$parser Pflicht XMLParser Eine gültige XML-Parser-Ressource bzw. (ab PHP 8.0) ein XMLParser-Objekt, das zuvor mit xml_parser_create() erstellt wurde.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die aktuelle Zeilennummer als int zurück (beginnt bei 1). Gibt false zurück, wenn der übergebene Parameter kein gültiger Parser ist.

Beispiele

Fehlermeldung mit Zeilennummer ausgeben

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <item>Korrekt</item>
  <broken
</root>
XML;

$parser = xml_parser_create();

if (!xml_parse($parser, $xml, true)) {
    $errorCode = xml_get_error_code($parser);
    $errorMsg  = xml_error_string($errorCode);
    $line      = xml_get_current_line_number($parser);

    echo "XML-Fehler: {$errorMsg} in Zeile {$line}" . PHP_EOL;
}

xml_parser_free($parser);
XML-Fehler: not well-formed (invalid token) in Zeile 5

Zeilennummer im Element-Handler verfolgen

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <book id="1">
    <title>PHP Handbuch</title>
  </book>
  <book id="2">
    <title>MySQL Grundlagen</title>
  </book>
</catalog>
XML;

$parser = xml_parser_create();

xml_set_element_handler(
    $parser,
    function ($parser, $name, $attrs) {
        $line = xml_get_current_line_number($parser);
        echo "Start-Tag &lt;{$name}&gt; in Zeile {$line}" . PHP_EOL;
    },
    function ($parser, $name) {
        // End-Handler (leer)
    }
);

xml_parse($parser, $xml, true);
xml_parser_free($parser);
Start-Tag <CATALOG> in Zeile 2 Start-Tag <BOOK> in Zeile 3 Start-Tag <TITLE> in Zeile 4 Start-Tag <BOOK> in Zeile 6 Start-Tag <TITLE> in Zeile 7

// Wichtig · Fallstricke

PHP 8.0: Der Parameter $parser erwartet nun ein Objekt vom Typ XMLParser statt einer Ressource. Älterer Code, der eine Ressource übergab, bleibt dank interner Umstellung kompatibel, sollte aber auf die neue Schreibweise umgestellt werden.

Wird xml_parse() in mehreren Teilaufrufen (Chunked Parsing) verwendet, akkumuliert sich die Zeilennummer über alle Aufrufe, sofern der gleiche Parser wiederverwendet wird. Ein Reset ist nur durch Erstellen eines neuen Parsers möglich.