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
xml_parser_create_ns()— erstellt einen namespace-fähigen XML-Parser.xml_parse()— übergibt XML-Daten an den Parser und löst die Handler aus.xml_set_element_handler()— registriert Callbacks für öffnende und schließende Tags.xml_set_character_data_handler()— registriert einen Callback für Textinhalte.xml_parser_set_option()— ändert Parser-Optionen wie die Groß-/Kleinschreibungsanpassung.xml_parser_free()— gibt den Parser frei, wenn Sie fertig sind.xml_error_string()— gibt eine lesbare Fehlermeldung für einen Parse-Fehler zurück.