DOMDocument::createAttributeNS

(PHP 5, PHP 7, PHP 8)

DOMDocument::createAttributeNS Создаёт новый атрибут узла с соответствующим пространством имён

Описание

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

Эта функция создаёт новый объект класса DOMAttr. Этот узел не будет отображаться в документе до тех пор, пока он не будет вставлен, например, функцией DOMNode::appendChild().

Список параметров

namespace

URI пространства имён.

qualifiedName

Имя и префикс атрибута в виде prefix:tagname.

Возвращаемые значения

Новый экземпляр класса DOMAttr или false в случае ошибки.

Ошибки

DOM_INVALID_CHARACTER_ERR

Возникает, если qualifiedName содержит недопустимые символы.

DOM_NAMESPACE_ERR

Возникает, если qualifiedName неправильно сформировано, либо если qualifiedName имеет префикс, а namespace имеет значение null.

Список изменений

Версия Описание
8.3.0 Вызов этого метода без указания префикса теперь выберет префикс, вместо того чтобы использовать пространство имен по умолчанию. Ранее это создавало атрибут без префикса и неверно применяло пространство имён к элементу-владельцу, поскольку пространства имен по умолчанию не применяются к атрибутам.
8.3.0 Вызов этого метода с префиксом, который уже был объявлен на элементе-владельце с другим URI пространства имён, теперь изменит новый префикс, чтобы избежать создания конфликтов пространства имён. Это приводит поведение в соответствие со спецификацией DOM. Previously this threw a DOMException with code DOM_NAMESPACE_ERR.

Смотрите также

add a note add a note

User Contributed Notes 1 note

up
10
_ michael
14 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