Signatur
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
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);
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);
// 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).