Start · Sprachen · PHP · Referenz · xml_parse

xml_parse

Funktion

Parst einen XML-Datenblock mit dem angegebenen XML-Parser und löst dabei die registrierten Handler-Funktionen aus.

seit PHP 4.0.0 Kategorie: xml

Signatur

xml_parse(XMLParser $parser, string $data, bool $is_final = false): int

Beschreibung

xml_parse() verarbeitet einen XML-Datenblock (oder das gesamte Dokument auf einmal) mit einem zuvor über xml_parser_create() erstellten Parser. Beim Verarbeiten werden die registrierten Handler-Funktionen (z. B. für Start-Tags, End-Tags und Zeichendaten) aufgerufen, sobald die entsprechenden XML-Strukturen erkannt werden.

Ein wesentliches Merkmal der Funktion ist die Unterstützung für inkrementelles Parsing: Große XML-Dokumente können in Blöcken (Chunks) eingelesen und stückweise verarbeitet werden, ohne das gesamte Dokument im Speicher vorzuhalten. Der Parameter $is_final signalisiert dem Parser, ob der übergebene Datenblock der letzte ist – dies ist wichtig, damit der Parser abschließende Prüfungen durchführen kann.

Die Funktion gibt 1 bei Erfolg zurück. Im Fehlerfall gibt sie 0 zurück. Fehlerdetails lassen sich anschließend mit xml_get_error_code() und xml_error_string() ermitteln. Für eine strukturierte Fehlerbehandlung empfiehlt es sich daher, den Rückgabewert stets zu prüfen.

Alternativ zu dieser ereignisbasierten (SAX-artigen) Verarbeitung steht in PHP auch SimpleXML oder DOMDocument zur Verfügung, die eine baumbasierte Verarbeitung ermöglichen. xml_parse() eignet sich besonders dann, wenn Speichereffizienz bei sehr großen XML-Dokumenten gefragt ist.

Parameter

Name Typ Default Beschreibung
$parser Pflicht XMLParser Eine XMLParser-Instanz, die zuvor mit xml_parser_create() oder xml_parser_create_ns() erstellt wurde.
$data Pflicht string Der zu parsende XML-Datenblock. Kann das gesamte Dokument oder nur ein Teilblock (Chunk) bei inkrementeller Verarbeitung sein.
$is_final bool false Gibt an, ob dies der letzte zu parsende Datenblock ist. Bei true führt der Parser abschließende Prüfungen durch und schließt das Parsing ab. Muss beim letzten Aufruf auf true gesetzt werden.

Rückgabewert

Typ
int
Beschreibung
Gibt 1 zurück, wenn das Parsing erfolgreich war, oder 0 im Fehlerfall. Bei einem Fehler können xml_get_error_code() und xml_error_string() zur Fehlerdiagnose verwendet werden.

Beispiele

Einfaches XML-Dokument vollständig parsen

<?php
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<buecher>
  <buch id="1">
    <titel>PHP Praxis</titel>
    <autor>Max Mustermann</autor>
  </buch>
</buecher>';

$parser = xml_parser_create('UTF-8');

function startElement(XMLParser $parser, string $name, array $attrs): void {
    echo "Start-Tag: &lt;{$name}&gt;";
    if (!empty($attrs)) {
        foreach ($attrs as $key => $value) {
            echo " [{$key}={$value}]";
        }
    }
    echo "\n";
}

function endElement(XMLParser $parser, string $name): void {
    echo "End-Tag: &lt;/{$name}&gt;\n";
}

function charData(XMLParser $parser, string $data): void {
    $trimmed = trim($data);
    if ($trimmed !== '') {
        echo "Text: {$trimmed}\n";
    }
}

xml_set_element_handler($parser, 'startElement', 'endElement');
xml_set_character_data_handler($parser, 'charData');

if (!xml_parse($parser, $xml, true)) {
    $errorCode = xml_get_error_code($parser);
    $errorMsg  = xml_error_string($errorCode);
    $line      = xml_get_current_line_number($parser);
    echo "XML-Fehler: {$errorMsg} in Zeile {$line}";
}

xml_parser_free($parser);
Start-Tag: <BUECHER> Start-Tag: <BUCH> [ID=1] Start-Tag: <TITEL> Text: PHP Praxis End-Tag: </TITEL> Start-Tag: <AUTOR> Text: Max Mustermann End-Tag: </AUTOR> End-Tag: </BUCH> End-Tag: </BUECHER>

Inkrementelles Parsing einer großen XML-Datei (Chunk-Verarbeitung)

<?php
$parser = xml_parser_create('UTF-8');

xml_set_element_handler(
    $parser,
    function (XMLParser $p, string $name, array $attrs): void {
        echo "Element: {$name}\n";
    },
    function (XMLParser $p, string $name): void {}
);

$datei = 'grosse_datei.xml';
$fp = fopen($datei, 'r');

if ($fp === false) {
    die('Datei konnte nicht geöffnet werden.');
}

while (!feof($fp)) {
    $chunk   = fread($fp, 4096); // 4 KB pro Durchgang
    $isFinal = feof($fp);

    if (!xml_parse($parser, $chunk, $isFinal)) {
        $errorCode = xml_get_error_code($parser);
        $errorMsg  = xml_error_string($errorCode);
        $line      = xml_get_current_line_number($parser);
        echo "Fehler beim Parsen: {$errorMsg} in Zeile {$line}\n";
        break;
    }
}

fclose($fp);
xml_parser_free($parser);
echo "Parsing abgeschlossen.\n";

// Wichtig · Fallstricke

Zeichenkodierung: Der Parser erwartet, dass die Eingabedaten mit der beim Erstellen des Parsers angegebenen Kodierung übereinstimmen. Abweichungen können zu unerwarteten Fehlern oder verstümmelten Zeichen führen.

Groß-/Kleinschreibung: Standardmäßig wandelt der Parser Tag- und Attributnamen in Großbuchstaben um. Dieses Verhalten kann mit xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0) deaktiviert werden.

Ressourcen freigeben: Nach dem Parsing sollte der Parser immer mit xml_parser_free() freigegeben werden, um Speicherlecks zu vermeiden – auch bei aufgetretenen Fehlern.

Externe Entitäten: Die expat-basierte XML-Erweiterung ist generell nicht anfällig für XXE-Angriffe (XML External Entity), da externe Entitäten standardmäßig nicht aufgelöst werden. Dennoch sollten Eingaben aus nicht vertrauenswürdigen Quellen stets sorgfältig validiert werden.