Signatur
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
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);
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);
// 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.