Start · Sprachen · PHP · Referenz · xml_parser_create_ns

xml_parser_create_ns

Funktion

Erstellt einen XML-Parser mit Namespace-Unterstützung und gibt eine <code>XMLParser</code>-Instanz zurück.

seit PHP 4.0.5 Kategorie: xml

Signatur

xml_parser_create_ns(string $encoding = 'UTF-8', string $separator = ':'): XMLParser

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

Typ
XMLParser
Beschreibung
Gibt eine 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);
Start-Tag: ROOT Start-Tag: http://example.com/ns|ITEM Text: Wert End-Tag: http://example.com/ns|ITEM End-Tag: ROOT

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";
}
http://www.w3.org/2003/05/soap-envelope#ENVELOPE http://www.w3.org/2003/05/soap-envelope#BODY http://www.example.org/stock#GETPRICE http://www.example.org/stock#SYMBOL

// 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.