Signatur
Beschreibung
xml_get_current_byte_index() liefert die aktuelle Byte-Position innerhalb des XML-Dokuments, das vom angegebenen Parser verarbeitet wird. Dabei handelt es sich um den absoluten Offset in Bytes ab dem Anfang des Dokuments, nicht um eine Zeichen- oder Zeilen-Position.
Diese Funktion wird typischerweise innerhalb von Fehler-Callbacks oder Handler-Funktionen aufgerufen, die über xml_set_error_handler() oder andere xml_set_*_handler()-Funktionen registriert wurden. So lässt sich präzise bestimmen, an welcher Stelle im Rohdatenstrom ein Fehler oder ein bestimmtes Ereignis aufgetreten ist.
Besonders nützlich ist der Byte-Index in Kombination mit xml_get_current_line_number() und xml_get_current_column_number(), um aussagekräftige Fehlermeldungen zu erzeugen oder fehlerhafte Stellen in großen XML-Dokumenten schnell zu lokalisieren. Bei mehrbyte-kodierten Dokumenten (z. B. UTF-8) entspricht der Byte-Index nicht zwingend der Zeichen-Position.
Hinweis: Ab PHP 8.0.0 erwartet die Funktion ein XMLParser-Objekt statt einer Resource, da der interne Typ geändert wurde.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $parser Pflicht | XMLParser | Eine gültige XMLParser-Instanz (vor PHP 8.0 eine XML-Parser-Resource), die mit xml_parser_create() oder xml_parser_create_ns() erzeugt wurde. |
Rückgabewert
Beispiele
Byte-Index bei einem XML-Fehler ausgeben
<?php
$xml = '<?xml version="1.0"?><root><item>Text</item><broken></root>';
$parser = xml_parser_create();
function handleError(int $errno, string $errstr): void {
// Wird hier nicht direkt verwendet, Fehler wird unten abgefangen
}
if (!xml_parse($parser, $xml, true)) {
$errorCode = xml_get_error_code($parser);
$errorString = xml_error_string($errorCode);
$byteIndex = xml_get_current_byte_index($parser);
$line = xml_get_current_line_number($parser);
$column = xml_get_current_column_number($parser);
echo "XML-Fehler: {$errorString}" . PHP_EOL;
echo "Zeile: {$line}, Spalte: {$column}, Byte-Index: {$byteIndex}" . PHP_EOL;
}
xml_parser_free($parser);
Byte-Index in einem Element-Handler nutzen
<?php
$xml = '<?xml version="1.0"?><catalog><book id="1"><title>PHP 8</title></book></catalog>';
$parser = xml_parser_create();
function startElement(XMLParser $parser, string $name, array $attrs): void {
$byteIndex = xml_get_current_byte_index($parser);
echo "Element <{$name}> beginnt bei Byte-Index: {$byteIndex}" . PHP_EOL;
}
xml_set_element_handler($parser, 'startElement', null);
xml_parse($parser, $xml, true);
xml_parser_free($parser);
// Wichtig · Fallstricke
Mehrbyte-Kodierungen: Bei UTF-8-kodierten Dokumenten kann der Byte-Index von der Zeichen-Position abweichen, da ein Zeichen mehrere Bytes belegen kann. Wer genaue Zeichenpositionen benötigt, muss die Byte-Sequenz eigenständig analysieren.
PHP 8.0: Ab PHP 8.0.0 wurde die interne XML-Parser-Resource durch das XMLParser-Objekt ersetzt. Älterer Code, der eine Resource erwartet oder übergibt, muss angepasst werden.
Der zurückgegebene Wert ist stets 0-basiert; das erste Byte des Dokuments hat den Index 0.