W3docs

xml_parser_create()

Die Funktion xml_parser_create() ist eine eingebaute PHP-Funktion, die einen neuen XML-Parser erstellt, für ereignisgesteuerte SAX-Verarbeitung.

Die Funktion xml_parser_create() ist eine eingebaute PHP-Funktion, die einen neuen XML-Parser erstellt. Sie gehört zur veralteten xml-Erweiterung (Expat) und wird für SAX-basiertes (ereignisgesteuertes) Parsen verwendet. Im Gegensatz zu höherwertigen Erweiterungen wie SimpleXML oder DOMDocument verarbeitet dieser Parser XML-Daten sequenziell, indem er benutzerdefinierte Callback-Funktionen für Elemente, Attribute und Zeichendaten auslöst.

Die Funktion xml_parser_create() ist nützlich, wenn Sie große XML-Dateien stream-artig parsen möchten, bestimmte Daten extrahieren müssen, ohne das gesamte Dokument in den Speicher zu laden, oder XML auf einer niedrigen Ebene ereignisgesteuert verarbeiten möchten.

Die Funktion gibt einen XML-Parser zurück, den Sie in einer Variable speichern und an alle anderen xml_*-Funktionen übergeben. Ab PHP 8.0 gibt sie ein XMLParser-Objekt zurück; in früheren Versionen wurde eine resource zurückgegeben. In beiden Fällen behandeln Sie ihn als undurchsichtigen Handle — setzen Sie Handler darauf, füttern Sie ihn mit Daten über xml_parse() und geben Sie ihn anschließend mit xml_parser_free() frei.

Syntax

Die Syntax der Funktion xml_parser_create() lautet wie folgt:

Syntax der Funktion xml_parser_create()

xml_parser_create([$encoding])

Dabei ist $encoding die vom XML-Dokument verwendete Zeichenkodierung (zum Beispiel "UTF-8", "ISO-8859-1" oder "US-ASCII"). Dieser Parameter ist optional; wird er weggelassen, erkennt der Parser die Kodierung aus der XML-Deklaration des Dokuments.

Verwendungsbeispiele

Schauen wir uns einige praktische Beispiele für die Verwendung von xml_parser_create() in PHP an.

Beispiel 1: Erstellen eines XML-Parsers

Mit der Funktion xml_parser_create() können Sie eine Parser-Ressource initialisieren. Beachten Sie, dass das bloße Erstellen des Parsers keine Daten verarbeitet; Sie müssen Handler konfigurieren und xml_parse() aufrufen, um XML tatsächlich zu parsen.

Verwendung der Funktion xml_parser_create() zum Erstellen eines neuen XML-Parsers in PHP

$xml_parser = xml_parser_create();

Dieser Code erstellt eine neue XML-Parser-Ressource. Für sich allein ist sie nur ein leerer Container, der zur Konfiguration bereit ist.

Beispiel 2: Parsen von XML-Daten

Um XML tatsächlich zu parsen, müssen Sie Event-Handler einrichten und mit xml_parse() Daten an den Parser übergeben.

Verwendung der Funktion xml_parser_create() zum Parsen von XML-Daten in PHP

$xml_parser = xml_parser_create();
$xml_data = file_get_contents("data.xml");

// Set up element handlers
xml_set_element_handler($xml_parser, function($parser, $name) {
    echo "Start element: $name\n";
}, function($parser, $name) {
    echo "End element: $name\n";
});

// Parse the data
if (!xml_parse($xml_parser, $xml_data, true)) {
    die(sprintf("XML error: %s at line %d",
        xml_error_string(xml_get_error_code($xml_parser)),
        xml_get_current_line_number($xml_parser)));
}
xml_parser_free($xml_parser);

Dieser Code erstellt einen Parser, registriert Callbacks für öffnende und schließende Tags und verwendet xml_parse() zur Verarbeitung der XML-Datei. Der Parser löst die Callbacks aus, während er die Daten sequenziell liest.

Beispiel 3: Extrahieren von Daten aus eingebettetem XML

Dieses in sich geschlossene Beispiel parst einen XML-String und sammelt den Text jedes Elements mithilfe eines Zeichendaten-Handlers in einem Array. Es läuft ohne externe Datei.

Extrahieren von Daten aus XML mit der xml-Erweiterung in PHP

$xml_data = <<<XML
<?xml version="1.0"?>
<book>
    <title>Learn PHP</title>
    <author>W3docs</author>
</book>
XML;

$xml_parser = xml_parser_create();
$current_tag = '';
$book = [];

xml_set_element_handler(
    $xml_parser,
    function ($parser, $name) use (&$current_tag) {
        $current_tag = $name; // element names arrive UPPERCASE by default
    },
    function ($parser, $name) use (&$current_tag) {
        $current_tag = '';
    }
);

xml_set_character_data_handler(
    $xml_parser,
    function ($parser, $data) use (&$current_tag, &$book) {
        $data = trim($data);
        if ($current_tag !== '' && $data !== '') {
            $book[$current_tag] = $data;
        }
    }
);

xml_parse($xml_parser, $xml_data, true);
xml_parser_free($xml_parser);

print_r($book);

Ausgabe:

Array
(
    [TITLE] => Learn PHP
    [AUTHOR] => W3docs
)

Beachten Sie, dass die Schlüssel in Großbuchstaben ausgegeben werden. Standardmäßig wandelt der Expat-Parser Elementnamen in Großbuchstaben um, weshalb der Handler TITLE und AUTHOR anstatt title und author speichert. Um die ursprüngliche Schreibweise beizubehalten, deaktivieren Sie die Groß-/Kleinschreibungsanpassung direkt nach dem Erstellen des Parsers:

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);

Der Zeichendaten-Handler kann auch mehrfach pro Element ausgelöst werden (zum Beispiel wenn Text durch Entities oder Zeilenumbrüche aufgeteilt wird), daher verknüpft dieses Beispiel mit .=-Logik — hier reicht eine einzelne Zuweisung aus, da jeder Wert eine kurze Zeichenkette ist.

xml_parser_create() ist für ereignisgesteuertes Parsen ausgelegt und führt keine Schema-Validierung durch. Für die XSD-Validierung werden die höherwertigen Erweiterungen DOMDocument oder SimpleXML empfohlen.

Fazit

In diesem Artikel haben wir die PHP-Funktion xml_parser_create() besprochen und erklärt, wie sie zum Erstellen eines neuen SAX-basierten XML-Parsers verwendet werden kann. Wir haben erläutert, was die Funktion tut, ihre Syntax beschrieben und Beispiele zur Konfiguration von Handlern sowie zur sequenziellen Verarbeitung von XML-Daten gegeben. Anhand dieser Beispiele können Sie XML-Dateien effizient stream-artig parsen und bestimmte Daten in Ihren PHP-Anwendungen extrahieren. Für die meisten modernen Anwendungsfälle sollten Sie SimpleXML oder DOMDocument in Betracht ziehen, die höherwertige APIs und integrierte Validierung ohne manuelle Parser-Einrichtung bieten.

Verwandte Funktionen

Übung

Übung
Wie lautet die korrekte Methode, um einen XML-Parser in PHP zu erstellen?
Wie lautet die korrekte Methode, um einen XML-Parser in PHP zu erstellen?
Was this page helpful?