DOMDocument::createAttributeNS

(PHP 5, PHP 7, PHP 8)

DOMDocument::createAttributeNS Cria um novo nó de atributo com um namespace associado

Descrição

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

Esta função cria uma nova instância da classe DOMAttr. Este nó não aparecerá no documento a menos que seja inserido, por exemplo, com DOMNode::appendChild().

Parâmetros

namespace

O URI do namespace.

qualifiedName

O nome qualificado e o prefixo do atributo, como prefix:tagname.

Valor Retornado

O novo DOMAttr ou false se ocorrer um erro.

Erros/Exceções

DOM_INVALID_CHARACTER_ERR

Gerado se qualifiedName contiver um caractere inválido.

DOM_NAMESPACE_ERR

Gerado se qualifiedName for um nome qualificado malformado, ou se qualifiedName tiver um prefixo e namespace for null.

Registro de Alterações

Versão Descrição
8.3.0 Chamar este método sem especificar um prefixo agora escolherá um prefixo em vez de assumir o namespace padrão. Anteriormente, isso criaria um atributo sem prefixo e aplicaria incorretamente o namespace ao elemento pai porque os namespaces padrão não se aplicam a atributos.
8.3.0 Chamar este método usando um prefixo que já foi declarado no elemento pai com um URI de namespace diferente agora mudará o novo prefixo para evitar criar conflitos de namespace. Isso alinha o comportamento com a especificação DOM. Anteriormente, isso lançava uma DOMException com o código DOM_NAMESPACE_ERR.

Veja Também

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