xml_get_current_column_number()
Die Funktion xml_get_current_column_number() ist eine eingebaute PHP-Funktion, die die aktuelle Spaltennummer eines XML-Parsers abruft.
Die Funktion xml_get_current_column_number() ist eine eingebaute PHP-Funktion, die die aktuelle Spaltennummer eines XML-Parsers abruft — den horizontalen Zeichenversatz (1-basiert) innerhalb der aktuellen Zeile, den der Parser erreicht hat. Sie gehört zur veralteten XML Parser (Expat)-Erweiterung, nicht zu SimpleXML oder DOM, und ist nur während eines laufenden Parse-Vorgangs aussagekräftig.
Diese Seite behandelt, was die Funktion zurückgibt, ihre Syntax und ausführbare Beispiele, die die aus SAX-Event-Handlern gemeldete Spaltennummer zeigen. Sie ist am nützlichsten, um die Position eines Elements oder Fehlers in der Eingabe genau zu bestimmen — zum Beispiel um eine präzise Log-Meldung oder eine hilfreiche Diagnose „Syntaxfehler bei Spalte X" zu schreiben.
Da der Wert die aktuelle Position des Parsers widerspiegelt, muss er aus einem Handler heraus aufgerufen werden (oder unmittelbar nachdem xml_parse() fehlschlägt). Er ergänzt auf natürliche Weise xml_get_current_line_number() und xml_get_current_byte_index(), um eine Position vollständig zu beschreiben.
Syntax
xml_get_current_column_number(XMLParser $parser): int|false$parser ist der XML-Parser, der mit xml_parser_create() erstellt wurde (ab PHP 8.0 ist dies ein XMLParser-Objekt; in früheren Versionen war es eine Ressource). Die Funktion gibt die Spaltennummer als Integer zurück oder false, wenn $parser kein gültiger Parser ist.
Verwendungsbeispiele
Schauen wir uns einige praktische Beispiele für die Verwendung von xml_get_current_column_number() in PHP an.
Beispiel 1: Aktuelle Spaltennummer eines XML-Parsers abrufen
Angenommen, Sie haben einen XML-String, den Sie mit der veralteten XML-Parser-Erweiterung in PHP parsen möchten. Sie können xml_get_current_column_number() innerhalb eines SAX-Event-Handlers aufrufen — registriert mit xml_set_element_handler() — um die Spalte abzurufen, an der jedes Tag beginnt:
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, function($parser, $name) {
echo "Start tag: $name at column " . xml_get_current_column_number($parser) . "\n";
}, function($parser, $name) {
echo "End tag: $name\n";
});
$xml_data = "<root>\n <item>Test</item>\n</root>";
xml_parse($xml_parser, $xml_data);
xml_parser_free($xml_parser);Dieser Code erstellt einen Parser, registriert Start/End-Element-Handler und führt xml_parse() über die Daten aus. Im Start-Tag-Handler wird die aktuelle Spaltennummer gelesen und ausgegeben, anschließend wird der Parser mit xml_parser_free() freigegeben. Beachten Sie, dass die Spalte auf das Zeichen nach dem Tag-Öffner zeigt, sodass sie sich verschiebt, während der Parser jedes Tag verarbeitet. Die Ausgabe ist:
Start tag: ROOT at column 6
Start tag: ITEM at column 8
End tag: ITEM
End tag: ROOTBeispiel 2: Spaltennummern während des Parsens verfolgen
Angenommen, Sie müssen die Spaltenposition von Textinhalt beim Parsen einer XML-Datei verfolgen. Da xml_parse_into_struct() keine Spaltennummern in seinem Ausgabe-Array befüllt, erfordert die Echtzeit-Verfolgung SAX-artige Event-Handler statt einer Iteration nach dem Parsen. Sie können einen Zeichendaten-Handler mit xml_set_character_data_handler() registrieren, um Spaltenpositionen zu erfassen, wenn der Parser auf Text trifft:
$xml_parser = xml_parser_create();
xml_set_character_data_handler($xml_parser, function($parser, $data) {
$col = xml_get_current_column_number($parser);
echo "Text content found at column: $col\n";
});
$xml_data = "<root>\n <item>Sample Data</item>\n</root>";
xml_parse($xml_parser, $xml_data);
xml_parser_free($xml_parser);Der Zeichendaten-Handler kann für einen Textknoten mehrmals ausgelöst werden (zum Beispiel rund um Leerzeichen und Zeilenumbrüche), sodass typischerweise mehrere gemeldete Spalten zu sehen sind. Dieser Ansatz verfolgt Positionen in Echtzeit, im Gegensatz zur Array-Iteration nach dem Parsen, die nicht auf den dynamischen Parser-Zustand zugreifen kann. Die Ausgabe für diese Eingabe ist:
Text content found at column: 3
Text content found at column: 20
Text content found at column: 1Hinweise und Fallstricke
- Aufruf während des Parsens. Der Wert ist nur sinnvoll, solange
xml_parse()läuft (innerhalb eines Handlers) oder unmittelbar nach einem Parse-Fehler. Außerhalb dieses Zeitfensters hat er keine nützliche Bedeutung. - Spalten sind 1-basiert und zeilenbezogen. Die Zählung wird bei jedem Zeilenumbruch zurückgesetzt. Kombinieren Sie dies mit
xml_get_current_line_number(), um eine vollständigeZeile:Spalte-Position zu erhalten. - Byte-Index vs. Spaltennummer. Wenn Sie den absoluten Versatz vom Dokumentanfang anstelle der zeilenbezogenen Position benötigen, verwenden Sie
xml_get_current_byte_index(). - Veraltete Erweiterung. Der Expat-basierte XML-Parser ist prozedural und ereignisgesteuert. Für die meisten modernen Dokumentverarbeitungsaufgaben empfiehlt sich SimpleXML oder DOM — aber für das Streaming großer Dateien oder präzise Fehlerpositionen ist diese Erweiterung nach wie vor das richtige Werkzeug.
Fazit
In diesem Artikel haben wir die PHP-Funktion xml_get_current_column_number() und ihre Verwendung zur Abfrage der aktuellen Spaltennummer eines XML-Parsers in PHP besprochen. Wir haben erklärt, was die Funktion tut, ihre Syntax vorgestellt und Beispiele für praktische Einsatzszenarien gezeigt. Anhand dieser Beispiele können Sie die aktuelle Position eines XML-Parsers während des Parsens einfach verfolgen und in Ihren PHP-Anwendungen für Logging, Debugging oder Fortschrittsverfolgung nutzen.