Signatur
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
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: <{$name}>";
if (!empty($attrs)) {
foreach ($attrs as $key => $value) {
echo " [{$key}={$value}]";
}
}
echo "\n";
}
function endElement(XMLParser $parser, string $name): void {
echo "End-Tag: </{$name}>\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);
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.