Signatur
Beschreibung
XMLParser ist eine vollständig opake Klasse (d. h. sie hat keine öffentlich zugänglichen Eigenschaften oder Methoden) und dient ausschließlich als typsicheres Handle-Objekt für den in PHP integrierten expat-basierten XML-Pull-Parser. Vor PHP 8.0 wurde dieser Handle als resource zurückgegeben; seit PHP 8.0 wird stattdessen eine Instanz von XMLParser zurückgeliefert.
Instanzen von XMLParser werden nicht direkt mit new XMLParser() erzeugt, sondern ausschließlich über die Fabrikfunktion xml_parser_create() oder xml_parser_create_ns(). Das zurückgegebene Objekt wird anschließend an sämtliche xml_*()-Funktionen übergeben, z. B. xml_set_element_handler(), xml_parse() oder xml_parser_free().
Der Vorteil gegenüber der alten Resource-Darstellung liegt in der verbesserten Typprüfung: Funktionen, die einen XML-Parser erwarten, können nun XMLParser als Typhinweis verwenden, was Fehler durch versehentliche Übergabe falscher Werte frühzeitig aufdeckt. Außerdem wird der Speicher automatisch freigegeben, wenn keine Referenz mehr auf das Objekt existiert (ähnlich wie bei anderen modernen PHP-Objekten).
Die Klasse eignet sich für ereignisbasiertes (SAX-ähnliches) Parsing großer XML-Dokumente, bei denen das vollständige Laden des Dokuments in den Speicher (wie bei SimpleXML oder DOMDocument) vermieden werden soll.
Beispiele
Einfaches SAX-basiertes XML-Parsing
<?php
// Parser erzeugen – gibt eine XMLParser-Instanz zurück
$parser = xml_parser_create('UTF-8');
// Typ-Check: XMLParser ist eine eigene Klasse seit PHP 8.0
var_dump($parser instanceof XMLParser); // bool(true)
// Handler für Start-Tags registrieren
xml_set_element_handler(
$parser,
function (XMLParser $p, string $name, array $attrs): void {
echo "Start-Tag: <$name>\n";
},
function (XMLParser $p, string $name): void {
echo "End-Tag: </$name>\n";
}
);
// Handler für Textknoten
xml_set_character_data_handler(
$parser,
function (XMLParser $p, string $data): void {
$trimmed = trim($data);
if ($trimmed !== '') {
echo "Text: $trimmed\n";
}
}
);
$xml = '<root><item>Hallo</item><item>Welt</item></root>';
if (!xml_parse($parser, $xml, true)) {
$errorCode = xml_get_error_code($parser);
$errorStr = xml_error_string($errorCode);
$line = xml_get_current_line_number($parser);
throw new RuntimeException("XML-Fehler: $errorStr in Zeile $line");
}
// Ressourcen freigeben (optional, da Objekt automatisch aufgeräumt wird)
xml_parser_free($parser);
Namespace-fähigen Parser erstellen und Handle weitergeben
<?php
// Namespace-fähigen Parser erzeugen
$parser = xml_parser_create_ns('UTF-8', ':');
// Case-Folding deaktivieren (Tagnamen nicht in Großbuchstaben umwandeln)
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
function handleStart(XMLParser $parser, string $name, array $attrs): void
{
echo "Element: $name\n";
foreach ($attrs as $attrName => $attrValue) {
echo " Attribut $attrName = $attrValue\n";
}
}
xml_set_element_handler($parser, 'handleStart', null);
$xml = '<?xml version="1.0"?>' .
'<ns:root xmlns:ns="http://example.com">' .
'<ns:child lang="de">Inhalt</ns:child>' .
'</ns:root>';
xml_parse($parser, $xml, true);
xml_parser_free($parser);
// Wichtig · Fallstricke
Direktes Instanziieren nicht möglich: new XMLParser() wirft einen Fehler. Verwende stets xml_parser_create() oder xml_parser_create_ns().
Groß-/Kleinschreibung: Standardmäßig wandelt der Parser alle Tag- und Attributnamen in Großbuchstaben um (Case-Folding). Dies kann mit xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0) deaktiviert werden.
Ressourcenfreigabe: Seit PHP 8.0 wird der Speicher automatisch freigegeben, wenn das XMLParser-Objekt den Gültigkeitsbereich verlässt. Ein expliziter Aufruf von xml_parser_free() ist nicht mehr zwingend erforderlich, gilt aber als gute Praxis.
Zeichenkodierung: Der Parser unterstützt nur UTF-8, ISO-8859-1 und US-ASCII als Eingabekodierung. Andere Kodierungen müssen vor der Übergabe konvertiert werden.