Start · Sprachen · PHP · Referenz · xml_parser_create

xml_parser_create

Funktion

Erstellt einen neuen XML-Parser und gibt eine <code>XMLParser</code>-Instanz zurück, die zum Parsen von XML-Dokumenten verwendet wird.

seit PHP 4.0.0 Kategorie: xml

Signatur

xml_parser_create(string $encoding = ""): XMLParser

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

Typ
XMLParser
Beschreibung
Gibt bei Erfolg eine 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);
Öffnendes Tag: buecher Öffnendes Tag: buch [id="1"] Öffnendes Tag: titel Text: PHP Handbuch Schließendes Tag: titel Öffnendes Tag: autor Text: Max Mustermann Schließendes Tag: autor Schließendes Tag: buch Schließendes Tag: buecher

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.