Start · Sprachen · PHP · Referenz · xml_set_processing_instruction_handler

xml_set_processing_instruction_handler

Funktion

Registriert einen Callback-Handler, der aufgerufen wird, wenn der XML-Parser eine Processing Instruction (PI) findet.

seit PHP 4.0.0 Kategorie: xml

Signatur

xml_set_processing_instruction_handler(XMLParser $parser, callable $handler): bool

Beschreibung

Processing Instructions (PIs) sind spezielle XML-Konstrukte der Form <?ziel daten?>, die prozessorspezifische Anweisungen außerhalb der Nutzdaten transportieren. Ein klassisches Beispiel ist <?xml-stylesheet type="text/css" href="style.css"?>. Mit xml_set_processing_instruction_handler() lässt sich für einen Parser eine Funktion registrieren, die beim Auftreten solcher PIs automatisch aufgerufen wird.

Der übergebene Handler muss die Signatur function(XMLParser $parser, string $target, string $data): void besitzen. $target enthält das PI-Ziel (z. B. php oder xml-stylesheet), $data den Rest der PI bis zum schließenden ?>. So lassen sich eigene PI-Dialekte interpretieren oder bekannte PIs (wie Stylesheet-Verknüpfungen) gezielt verarbeiten.

Die Funktion gehört zur PHP-Erweiterung xml (Expat-basiert) und wird zusammen mit xml_parse() bzw. xml_parse_into_struct() verwendet. Soll kein Handler aktiv sein, kann null übergeben werden, um einen zuvor registrierten Handler zu deaktivieren.

Diese API ist ereignisgesteuert (SAX-Stil) und damit besonders für große XML-Dokumente geeignet, bei denen ein vollständiges DOM-Modell im Speicher zu teuer wäre.

Parameter

Name Typ Default Beschreibung
$parser Pflicht XMLParser Eine gültige XML-Parser-Ressource bzw. ein XMLParser-Objekt, das zuvor mit xml_parser_create() erzeugt wurde.
$handler Pflicht callable|null Der Callback, der bei jeder erkannten Processing Instruction aufgerufen wird. Die Funktion muss die Parameter (XMLParser $parser, string $target, string $data) akzeptieren. Wird null übergeben, wird ein zuvor gesetzter Handler entfernt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Handler erfolgreich registriert wurde, andernfalls false.

Beispiele

Stylesheet-PI aus einem XML-Dokument auslesen

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="style.css"?>
<root>
    <item>Beispiel</item>
</root>
XML;

$parser = xml_parser_create();

xml_set_processing_instruction_handler($parser, function (XMLParser $parser, string $target, string $data): void {
    echo "PI gefunden:" . PHP_EOL;
    echo "  Ziel : " . $target . PHP_EOL;
    echo "  Daten: " . $data  . PHP_EOL;
});

if (!xml_parse($parser, $xml, true)) {
    $errorCode = xml_get_error_code($parser);
    echo 'XML-Fehler: ' . xml_error_string($errorCode);
}

xml_parser_free($parser);
PI gefunden: Ziel : xml-stylesheet Daten: type="text/css" href="style.css"

Eigene PI-Direktiven verarbeiten

<?php
$xml = <<<XML
<?xml version="1.0"?>
<?myapp action="cache-clear" ttl="300"?>
<catalog>
    <product id="1">Widget</product>
</catalog>
XML;

$parser = xml_parser_create();

xml_set_processing_instruction_handler($parser, function (XMLParser $parser, string $target, string $data): void {
    if ($target === 'myapp') {
        // Einfache Key-Value-Auswertung
        preg_match_all('/([\w-]+)="([^"]*)"/', $data, $matches, PREG_SET_ORDER);
        $attrs = [];
        foreach ($matches as $m) {
            $attrs[$m[1]] = $m[2];
        }
        echo "Eigene Direktive erkannt:" . PHP_EOL;
        foreach ($attrs as $key => $value) {
            echo "  $key = $value" . PHP_EOL;
        }
    }
});

xml_parse($parser, $xml, true);
xml_parser_free($parser);
Eigene Direktive erkannt: action = cache-clear ttl = 300

// Wichtig · Fallstricke

Zeichenkodierung: Das Ziel ($target) wird vom Parser grundsätzlich in Großbuchstaben umgewandelt, sofern der Parser mit der Standardeinstellung betrieben wird. Soll die originale Groß-/Kleinschreibung erhalten bleiben, muss xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false) gesetzt werden.

Sicherheit: PI-Daten stammen aus dem zu parsenden Dokument. Werden sie weiterverarbeitet (z. B. in SQL-Abfragen oder HTML-Ausgaben eingebettet), sind sie wie alle externen Daten zu validieren und zu escapen, um Injection-Angriffe zu verhindern.

Ab PHP 8.0.0 liefert xml_parser_create() ein XMLParser-Objekt statt einer klassischen Ressource; die restliche API (einschließlich dieser Funktion) bleibt kompatibel.