W3docs

xml_parser_set_option()

Die Funktion xml_parser_set_option() ist eine in PHP eingebaute Funktion, die eine Option an einem XML-Parser setzt.

Die Funktion xml_parser_set_option() ist eine in PHP eingebaute Funktion, die Konfigurationsoptionen an einem XML-Parser setzt. Sie gehört zur veralteten XML-Parser-Erweiterung (Expat), die XML im SAX-Stil analysiert — dabei werden Event-Callbacks ausgelöst, während gelesen wird — anstatt wie SimpleXML oder DOM einen Baum im Speicher aufzubauen. Sie wird nach xml_parser_create(), aber vor dem Parsen aufgerufen, um zu steuern, wie der Parser Tag-Namen-Groß-/Kleinschreibung, Leerzeichen und Zeichenkodierung behandelt.

Syntax

xml_parser_set_option(XMLParser $parser, int $option, string|int $value): bool
  • $parser — der von xml_parser_create() zurückgegebene Parser. Ab PHP 8.0 ist dies ein XMLParser-Objekt; in PHP 7 und früher war es eine Ressource.
  • $option — eine der unten aufgeführten Optionskonstanten.
  • $value — der Wert, der für diese Option gesetzt werden soll.

Die Funktion gibt true bei Erfolg zurück, oder false, wenn der Parser oder die Option ungültig ist.

Verfügbare Optionen

KonstanteTypWas sie steuert
XML_OPTION_CASE_FOLDINGbool (Standard true)Wenn aktiviert, werden Tag- und Attributnamen in Großbuchstaben umgewandelt, bevor sie Ihre Handler erreichen. Auf false setzen, um die ursprüngliche Schreibweise beizubehalten.
XML_OPTION_SKIP_TAGSTARTintAnzahl der Zeichen, die vom Anfang eines Tag-Namens übersprungen werden sollen.
XML_OPTION_SKIP_WHITEboolWenn true, werden Elemente, die nur Leerzeichen enthalten, übersprungen.
XML_OPTION_TARGET_ENCODINGstringDie Kodierung, die an Ihre Handler übergeben wird — eine von ISO-8859-1 (Standard), US-ASCII oder UTF-8.

Den aktuellen Wert auslesen mit xml_parser_get_option(). Das Setzen einer Option, nachdem das Parsen begonnen hat, hat keine Wirkung — konfigurieren Sie den Parser daher zuerst.

Warum Case Folding wichtig ist

Dies ist die Option, die Sie am häufigsten benötigen werden. Standardmäßig wandelt der Parser jeden Tag-Namen in Großbuchstaben um, sodass ein Element <note> in Ihrem Handler als NOTE ankommt. Das überrascht alle, die Namen mit Kleinbuchstaben-Strings vergleichen. Das Deaktivieren von Case Folding behält Namen genau so, wie sie geschrieben wurden:

$parser = xml_parser_create();

// Default behaviour: case folding ON → names arrive upper-cased
xml_set_element_handler($parser,
    fn($p, $name, $attrs) => print("Start: $name\n"),
    fn($p, $name) => null
);
xml_parse($parser, "<note><to>Tove</to></note>", true);
xml_parser_free($parser);

Ausgabe:

Start: NOTE
Start: TO

Setzen Sie XML_OPTION_CASE_FOLDING auf false, und dieselbe Eingabe behält ihre ursprüngliche Schreibweise (note, to).

Ein vollständiges Beispiel

Die XML-Parser-Erweiterung ist ereignisgesteuert: Es passiert nichts, bis Sie Handler registrieren und ihr Daten übergeben. Dieses Beispiel erstellt einen Parser, setzt zwei Optionen, registriert Start-/End-Handler und parst einen inline XML-String — keine externe Datei erforderlich, sodass Sie es direkt ausführen können:

$parser = xml_parser_create();

// Keep the original tag case instead of upper-casing
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
// Drop elements that contain only whitespace
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, true);

xml_set_element_handler(
    $parser,
    function ($parser, $name, $attrs) {
        echo "Start: $name\n";
    },
    function ($parser, $name) {
        echo "End: $name\n";
    }
);

$xml = "<note>\n  <to>Tove</to>\n  <from>Jani</from>\n</note>";
xml_parse($parser, $xml, true);

xml_parser_free($parser);

Ausgabe:

Start: note
Start: to
End: to
Start: from
End: from
End: note

Da Case Folding deaktiviert ist, behalten die Tag-Namen ihre Kleinschreibung. Der Aufruf von xml_set_element_handler() ermöglicht es xml_parse(), diese Ereignisse auszulösen; ohne registrierte Handler würde der Parser das Dokument lesen, aber keine Ausgabe erzeugen. Rufen Sie immer xml_parser_free() auf, wenn Sie fertig sind, um den Parser freizugeben.

Wann man es verwenden sollte

Verwenden Sie xml_parser_set_option() nur, wenn Sie bereits mit dem Low-Level-Expat-Parser arbeiten — typischerweise für das Streamen sehr großer XML-Dokumente, bei denen das Laden des gesamten Baums in den Speicher unerwünscht ist. Für die meisten alltäglichen Aufgaben (Konfiguration lesen, API-Antwort verarbeiten) greifen Sie stattdessen auf SimpleXML zurück, das wesentlich einfacher ist und keine dieser Konfiguration benötigt.

Fazit

xml_parser_set_option() konfiguriert den veralteten SAX-Parser — vor allem sein Verhalten bezüglich Case Folding, Leerzeichen und Kodierung. Setzen Sie jede Option bevor Sie xml_parse() aufrufen, registrieren Sie Element-Handler, damit Ereignisse ausgelöst werden, und geben Sie den Parser danach frei. Wenn Sie eine detaillierte, speichereffiziente Verarbeitung benötigen, bietet Ihnen diese Funktion diese Kontrolle; andernfalls sind SimpleXML oder DOM die einfachere Wahl.

Übungen

Übung
Was ist der Zweck der Funktion xml_parser_set_option() in PHP?
Was ist der Zweck der Funktion xml_parser_set_option() in PHP?
Was this page helpful?