Start · Sprachen · PHP · Referenz · xmlwriter_write_attribute_ns

xmlwriter_write_attribute_ns

Funktion

Schreibt ein vollständiges XML-Attribut mit Namensraum-Präfix und URI in einem einzigen Schritt in den <code>XMLWriter</code>-Puffer.

seit PHP 5.1.2 Kategorie: xml

Signatur

xmlwriter_write_attribute_ns(XMLWriter $writer, ?string $prefix, string $name, ?string $namespace, string $value): bool

Beschreibung

xmlwriter_write_attribute_ns() ermöglicht es, ein XML-Attribut inklusive Namensraum-Präfix und Namespace-URI in einem einzigen Aufruf zum aktuell geöffneten Element hinzuzufügen. Dies ist besonders nützlich, wenn XML-Dokumente mit mehreren Namensräumen (z. B. SOAP, XHTML oder benutzerdefinierte XML-Schemata) erzeugt werden müssen.

Im Gegensatz zur einfachen Funktion xmlwriter_write_attribute() übernimmt diese Funktion auch die korrekte Namensraum-Deklaration. Das Attribut wird dabei in der Form prefix:name="value" in den Ausgabe-Puffer geschrieben, und bei Bedarf wird die Namespace-URI als xmlns:prefix-Deklaration ergänzt.

Die Funktion muss aufgerufen werden, während ein Element mit xmlwriter_start_element() oder xmlwriter_start_element_ns() geöffnet ist. Sie kann nicht außerhalb eines geöffneten Elements verwendet werden. Die prozedurale Form dieser Funktion arbeitet mit einem XMLWriter-Ressource- bzw. Objekt-Parameter; alternativ kann die objektorientierte Methode XMLWriter::writeAttributeNs() verwendet werden.

Typische Einsatzgebiete sind die Erzeugung von SOAP-Envelopes, SVG-Dokumenten mit mehreren Namensräumen oder anderer standardisierter XML-Formate, bei denen Attribute Namensraum-qualifiziert sein müssen.

Parameter

Name Typ Default Beschreibung
$writer Pflicht XMLWriter Die XMLWriter-Instanz, in die geschrieben wird. Wird von Funktionen wie xmlwriter_open_memory() oder xmlwriter_open_uri() zurückgegeben.
$prefix Pflicht ?string Das Namensraum-Präfix des Attributs (z. B. "xsi"). Kann null sein, wenn kein Präfix verwendet werden soll.
$name Pflicht string Der lokale Name des Attributs (z. B. "type" oder "schemaLocation").
$namespace Pflicht ?string Die Namensraum-URI, die dem Präfix zugeordnet wird (z. B. "http://www.w3.org/2001/XMLSchema-instance"). Kann null sein, wenn keine URI deklariert werden soll.
$value Pflicht string Der Wert des Attributs. Sonderzeichen wie <, > und & werden automatisch escaped.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn kein Element geöffnet ist oder die Parameter ungültig sind).

Beispiele

XSI-Namensraum-Attribut in ein XML-Dokument schreiben

<?php
$writer = xmlwriter_open_memory();
xmlwriter_set_indent($writer, true);

xmlwriter_start_document($writer, '1.0', 'UTF-8');

xmlwriter_start_element_ns(
    $writer,
    null,
    'root',
    'http://example.com/ns'
);

// Namespace-qualifiziertes Attribut schreiben
xmlwriter_write_attribute_ns(
    $writer,
    'xsi',
    'schemaLocation',
    'http://www.w3.org/2001/XMLSchema-instance',
    'http://example.com/ns schema.xsd'
);

xmlwriter_write_element($writer, 'child', 'Inhalt');
xmlwriter_end_element($writer);
xmlwriter_end_document($writer);

echo xmlwriter_output_memory($writer);
<?xml version="1.0" encoding="UTF-8"?> <root xmlns="http://example.com/ns" xsi:schemaLocation="http://example.com/ns schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <child>Inhalt</child> </root>

SOAP-Envelope mit Namensraum-Attribut erzeugen

<?php
$writer = xmlwriter_open_memory();
xmlwriter_set_indent($writer, true);

xmlwriter_start_document($writer, '1.0', 'UTF-8');

// SOAP Envelope
xmlwriter_start_element_ns($writer, 'soap', 'Envelope', 'http://schemas.xmlsoap.org/soap/envelope/');

// encodingStyle-Attribut mit SOAP-Namespace
xmlwriter_write_attribute_ns(
    $writer,
    'soap',
    'encodingStyle',
    null,
    'http://schemas.xmlsoap.org/soap/encoding/'
);

xmlwriter_start_element_ns($writer, 'soap', 'Body', null);
xmlwriter_start_element_ns($writer, null, 'GetUser', 'http://example.com/service');
xmlwriter_write_element($writer, 'UserId', '42');
xmlwriter_end_element($writer); // GetUser
xmlwriter_end_element($writer); // Body
xmlwriter_end_element($writer); // Envelope
xmlwriter_end_document($writer);

echo xmlwriter_output_memory($writer);
<?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <soap:Body> <GetUser xmlns="http://example.com/service"> <UserId>42</UserId> </GetUser> </soap:Body> </soap:Envelope>

// Wichtig · Fallstricke

Reihenfolge beachten: xmlwriter_write_attribute_ns() muss aufgerufen werden, nachdem ein Element geöffnet wurde (z. B. via xmlwriter_start_element()), aber bevor Kindelemente oder Textinhalte geschrieben werden. Andernfalls schlägt der Aufruf fehl.

Doppelte Namensraum-Deklarationen: PHP's XMLWriter erkennt nicht automatisch, ob eine Namespace-URI bereits deklariert wurde. Es kann daher zu doppelten xmlns:prefix-Deklarationen kommen, wenn die Funktion mehrfach mit gleicher URI aufgerufen wird. Dies erzeugt zwar gültiges XML, ist aber redundant.

Escaping: Der Attributwert wird automatisch XML-konform escaped. Eigene Escape-Maßnahmen vor dem Aufruf sind nicht nötig und können zu doppeltem Escaping führen.

OOP-Alternative: In der objektorientierten Schreibweise lautet die entsprechende Methode $writer->writeAttributeNs($prefix, $name, $namespace, $value).