Signatur
Beschreibung
xml_parser_create_ns() erzeugt einen neuen XML-Parser, der in der Lage ist, XML-Dokumente mit Namespace-Deklarationen korrekt zu verarbeiten. Im Gegensatz zu xml_parser_create() werden Namespace-URIs und lokale Namen bei diesem Parser automatisch aufgelöst und zusammengeführt.
Wenn ein Element oder Attribut einem Namespace angehört, wird der vollständige Elementname aus Namespace-URI und lokalem Name zusammengesetzt – getrennt durch den im Parameter separator angegebenen Trennzeichens (standardmäßig :). So ergibt z. B. der Namespace http://example.com/ns mit lokalem Name item den kombinierten Namen http://example.com/ns:item.
Der Parser arbeitet ereignisbasiert (SAX-Prinzip) und muss mit Callback-Funktionen für Start-Tags, End-Tags und Zeichendaten verbunden werden. Diese Callbacks werden über xml_set_element_handler() bzw. xml_set_character_data_handler() registriert. Nach der Verwendung sollte der Parser mit xml_parser_free() freigegeben werden.
Dieser Parser eignet sich besonders für die Verarbeitung von XML-Dokumenten, die mehrere Namespaces verwenden, wie SOAP-Nachrichten, Atom-Feeds, SVG oder XHTML, wo eine korrekte Namespace-Auflösung zwingend erforderlich ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $encoding | string | UTF-8 | Die Zeichenkodierung des zu parsenden XML-Dokuments. Unterstützte Werte sind UTF-8, ISO-8859-1 und US-ASCII. Die Ausgabe-Kodierung ist immer UTF-8. |
| $separator | string | : | Das Trennzeichen, das zwischen Namespace-URI und lokalem Namen eingefügt wird, wenn ein qualifizierter Elementname gebildet wird. Standardmäßig ist dies :. Um Mehrdeutigkeiten mit Namespace-URIs zu vermeiden, empfiehlt sich ein alternatives Zeichen wie | oder #. |
Rückgabewert
XMLParser-Instanz zurück (ab PHP 8.0; davor eine Ressource vom Typ xml), die für alle weiteren XML-Funktionen verwendet werden kann. Im Fehlerfall wird false zurückgegeben.Beispiele
Einfache Namespace-Verarbeitung
<?php
$xml = '<?xml version="1.0"?>
<root xmlns:ex="http://example.com/ns">
<ex:item>Wert</ex:item>
</root>';
$parser = xml_parser_create_ns('UTF-8', '|');
xml_set_element_handler(
$parser,
function ($parser, $name, $attrs) {
echo "Start-Tag: $name\n";
},
function ($parser, $name) {
echo "End-Tag: $name\n";
}
);
xml_set_character_data_handler($parser, function ($parser, $data) {
$trimmed = trim($data);
if ($trimmed !== '') {
echo "Text: $trimmed\n";
}
});
if (!xml_parse($parser, $xml, true)) {
echo 'Fehler: ' . xml_error_string(xml_get_error_code($parser));
}
xml_parser_free($parser);
Verarbeitung eines SOAP-ähnlichen Dokuments mit mehreren Namespaces
<?php
$soapXml = '<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:m="http://www.example.org/stock">
<env:Body>
<m:GetPrice>
<m:Symbol>IBM</m:Symbol>
</m:GetPrice>
</env:Body>
</env:Envelope>';
$elements = [];
$parser = xml_parser_create_ns('UTF-8', '#');
xml_set_element_handler(
$parser,
function ($parser, $qualifiedName, $attrs) use (&$elements) {
$elements[] = $qualifiedName;
},
function ($parser, $qualifiedName) {}
);
xml_parse($parser, $soapXml, true);
xml_parser_free($parser);
foreach ($elements as $el) {
echo $el . "\n";
}
// Wichtig · Fallstricke
Groß-/Kleinschreibung: Standardmäßig werden alle Element- und Attributnamen in Großbuchstaben umgewandelt. Dieses Verhalten kann mit xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false) deaktiviert werden, um die originale Schreibweise beizubehalten.
Separator-Wahl: Der Standard-Separator : kann problematisch sein, da er in Namespace-URIs (z. B. http://...) vorkommt. Es wird empfohlen, ein Zeichen zu wählen, das nicht in URIs vorkommt, z. B. | oder #.
PHP 8.0: Ab PHP 8.0 wird statt einer Ressource ein XMLParser-Objekt zurückgegeben. Bestehender Code, der auf Ressourcen prüft (z. B. is_resource()), muss angepasst werden.
Ressourcen freigeben: Der Parser sollte nach der Verwendung stets mit xml_parser_free() freigegeben werden, um Speicherlecks zu vermeiden – auch wenn PHP Ressourcen am Ende des Skripts automatisch freigibt.