Signatur
Beschreibung
xml_parser_create() erzeugt einen neuen expat-basierten XML-Parser. Der zurückgegebene Parser wird zusammen mit weiteren XML-Funktionen wie xml_parse(), xml_set_element_handler() oder xml_parser_free() verwendet, um XML-Dokumente ereignisorientiert (SAX-Stil) zu verarbeiten.
Das optionale $encoding-Argument legt die Zeichenkodierung des Eingabedokuments fest. Unterstützte Werte sind "ISO-8859-1", "UTF-8" und "US-ASCII". Wird kein Wert angegeben, verwendet PHP "UTF-8" als Standard. Für Dokumente mit Namespaces sollte stattdessen xml_parser_create_ns() genutzt werden.
Nach der Verwendung sollte der Parser mit xml_parser_free() explizit freigegeben werden, um Ressourcen zu schonen – obwohl moderne PHP-Versionen (ab PHP 8.0) den Parser als Objekt verwalten und er dadurch automatisch beim Verlassen des Scopes freigegeben wird.
Der SAX-Parser ist besonders geeignet für große XML-Dokumente, da das Dokument nicht vollständig in den Speicher geladen werden muss, sondern sequenziell verarbeitet wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $encoding | string | "UTF-8" | Die Zeichenkodierung des Eingabedokuments. Gültige Werte sind "UTF-8", "ISO-8859-1" und "US-ASCII". Wird der Parameter weggelassen oder als leerer String übergeben, wird "UTF-8" verwendet. |
Rückgabewert
XMLParser-Instanz zurück. In PHP < 8.0 wurde eine Ressource zurückgegeben; seit PHP 8.0 ist es ein Objekt vom Typ XMLParser. Im Fehlerfall wird false zurückgegeben.Beispiele
Einfaches Parsen eines XML-Strings
<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<buecher>
<buch id="1">
<titel>PHP Handbuch</titel>
<autor>Max Mustermann</autor>
</buch>
</buecher>
XML;
$parser = xml_parser_create('UTF-8');
// Callback für öffnende Tags
xml_set_element_handler(
$parser,
function ($parser, $name, $attrs) {
echo "Öffnendes Tag: " . strtolower($name);
if (!empty($attrs)) {
foreach ($attrs as $key => $val) {
echo " [" . strtolower($key) . "=\"$val\"]";
}
}
echo PHP_EOL;
},
function ($parser, $name) {
echo "Schließendes Tag: " . strtolower($name) . PHP_EOL;
}
);
// Callback für Textinhalt
xml_set_character_data_handler($parser, function ($parser, $data) {
$data = trim($data);
if ($data !== '') {
echo " Text: $data" . PHP_EOL;
}
});
if (!xml_parse($parser, $xml, true)) {
$errCode = xml_get_error_code($parser);
$errStr = xml_error_string($errCode);
$line = xml_get_current_line_number($parser);
echo "XML-Fehler: $errStr in Zeile $line (Fehlercode: $errCode)" . PHP_EOL;
}
xml_parser_free($parser);
XML-Datei chunk-weise parsen
<?php
$parser = xml_parser_create('UTF-8');
xml_set_element_handler(
$parser,
fn($p, $name, $attrs) => print("Start: $name\n"),
fn($p, $name) => print("Ende: $name\n")
);
$datei = 'daten.xml';
$handle = fopen($datei, 'r');
if ($handle === false) {
die("Datei konnte nicht geöffnet werden.");
}
while ($chunk = fread($handle, 4096)) {
$istLetzterChunk = feof($handle);
if (!xml_parse($parser, $chunk, $istLetzterChunk)) {
echo 'Fehler: ' . xml_error_string(xml_get_error_code($parser))
. ' in Zeile ' . xml_get_current_line_number($parser) . PHP_EOL;
break;
}
}
fclose($handle);
xml_parser_free($parser);
// Wichtig · Fallstricke
Codierungshinweis: Die Zeichenkodierung bezieht sich ausschließlich auf die Eingabe. PHP gibt Texte intern immer in der beim Erstellen angegebenen Kodierung aus. Bei Verwendung von "ISO-8859-1" werden Tag-Namen intern in Großbuchstaben umgewandelt; bei "UTF-8" wird die Groß-/Kleinschreibung beibehalten, jedoch kann das Verhalten durch xml_parser_set_option() mit XML_OPTION_CASE_FOLDING gesteuert werden.
PHP 8.0: Vor PHP 8.0 lieferte die Funktion eine Ressource statt einer XMLParser-Instanz. Code, der mit is_resource() den Rückgabewert prüft, muss für PHP 8+ angepasst werden.
Namespaces: Für XML-Dokumente mit Namespace-Unterstützung sollte xml_parser_create_ns() anstelle dieser Funktion verwendet werden, da Standard-Parser Namespace-Präfixe nicht automatisch auflösen.
Alternativen: Für einfachere Anwendungsfälle oder wenn das gesamte Dokument im Speicher gehalten werden kann, sind SimpleXML oder DOMDocument in der Regel komfortabler und fehlertoleranter.