DOMDocument::createAttributeNS

(PHP 5, PHP 7, PHP 8)

DOMDocument::createAttributeNS Create new attribute node with an associated namespace

Description

public DOMDocument::createAttributeNS(?string $namespace, string $qualifiedName): DOMAttr|false

This function creates a new instance of class DOMAttr. This node will not show up in the document unless it is inserted with (e.g.) DOMNode::appendChild().

Parameters

namespace

The URI of the namespace.

qualifiedName

The tag name and prefix of the attribute, as prefix:tagname.

Return Values

The new DOMAttr or false if an error occurred.

Errors/Exceptions

DOM_INVALID_CHARACTER_ERR

Raised if qualifiedName contains an invalid character.

DOM_NAMESPACE_ERR

Raised if qualifiedName is a malformed qualified name, or if qualifiedName has a prefix and namespace is null.

Changelog

Version Description
8.3.0 Calling this method without specifying a prefix will now choose a prefix instead of assuming the default namespace. Previously this would create an attribute without a prefix and incorrectly apply the namespace to the owner element because default namespaces don't apply on attributes.
8.3.0 Calling this method using a prefix that was already declared on the owner element with a different namespace URI will now change the new prefix to avoid creating namespace conflicts. This aligns the behaviour with the DOM specification. Previously this threw a DOMException with code DOM_NAMESPACE_ERR.

See Also

add a note

User Contributed Notes 1 note

up
10
_ michael
15 years ago
If a new namespace is introduced while creating and inserting an attribute, createAttributeNS() does not behave in the same way as createElementNS().(1) Location: With createAttributeNS(), the new namespace is declared at the level of the document element. By contrast, createElementNS() declares the new namespace at the level of the affected element itself.(2) Timing: With createAttributeNS(), the new namespace is declared in the document as soon as the attribute is created - the attribute does not actually have to be inserted. createElementNS() doesn't affect the document as long as the element is not inserted.An example:<?php        $source = <<<XML<?xml version="1.0" encoding="UTF-8"?><root><tag></tag></root>XML;        /*          I. createAttributeNS:     * a new namespace shows up immediately, even without insertion of the attribute     * the new namespace is declared at the level of the document element         */        $doc = new DOMDocument( '1.0' );    $doc->loadXML( $source );        // (1) We just create a "namespace'd" attribute without appending it to any element.    $attr_ns = $doc->createAttributeNS( '{namespace_uri_here}', 'example:attr' );        print $doc->saveXML() . "\n";        /*      Result: The namespace declaration appears, having been added to the document element. Output:            <?xml version="1.0" encoding="UTF-8"?>      <root xmlns:example="{namespace_uri_here}"><tag/></root>          */        // (2) Next, we give the attribute a value and insert it.    $attr_ns->value = 'value';     $doc->getElementsByTagName( 'tag' )->item(0)->appendChild( $attr_ns );        print $doc->saveXML() . "\n";        /*      Result: The "namespace'd" attribute shows up as well. Output:            <?xml version="1.0" encoding="UTF-8"?>      <root xmlns:example="{namespace_uri_here}"><tag example:attr="value"/></root>          */        /*          II. createElementNS:     * a new namespace shows up only when the element is inserted     * the new namespace is declared at the level of the inserted element         */        $doc = new DOMDocument( '1.0' );    $doc->loadXML( $source );        // (1) We create a "namespace'd" element without inserting it into the document.    $elem_ns = $doc->createElementNS( '{namespace_uri_here}', 'example:newtag' );        print $doc->saveXML() . "\n";        /*      Result: The document remains unchanged. Output:            <?xml version="1.0" encoding="UTF-8"?>      <root><tag/></root>          */        // (2) Next, we insert the new element.    $doc->getElementsByTagName( 'tag' )->item(0)->appendChild( $elem_ns );        print $doc->saveXML() . "\n";        /*      Result: The namespace declaration appears, and it is embedded in the element using it. Output:            <?xml version="1.0" encoding="UTF-8"?>      <root><tag><example:newtag xmlns:example="{namespace_uri_here}"/></tag></root>          */    ?>
To Top