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>
*/
?>
DOMDocument::createAttributeNS
(PHP 5)
DOMDocument::createAttributeNS — Crea un nuevo nodo atributo con un namespace asociado.
Descripción
Esta función crea una nueva instancia de la clase DOMAttr. Este nodo no se mostrará en el documento a no ser que sea insertado con (p.e.j.) DOMNode::appendChild().
Parámetros
-
namespaceURI -
El URI del namespace.
-
qualifiedName -
El nombre de etiqueta y prefijo del atributo, como prefix:tagname.
Valores devueltos
El nuevo DOMAttr o FALSE si ha ocurrido un error.
Errores/Excepciones
-
DOM_INVALID_CHARACTER_ERR -
Lanzado si
qualifiedNamecontiene un carácter inválido. -
DOM_NAMESPACE_ERR -
Lanzado si
qualifiedNamees un nombre calificado mal formado , o siqualifiedNametiene un prefijo ynamespaceURIesNULL.
Ver también
- DOMNode::appendChild() - Añade un nuevo hijo al final de los hijos
- DOMDocument::createAttribute() - Crear nuevo attribute
- DOMDocument::createCDATASection() - Crea un nuevo nodo cdata
- DOMDocument::createComment() - Crea un nuevo nodo de comentario
- DOMDocument::createDocumentFragment() - Crea un nuevo fragmento de documento
- DOMDocument::createElement() - Crea un nuevo nodo elemento
- DOMDocument::createElementNS() - Crea un nuevo nodo elemento con el nombre de espacio asociado
- DOMDocument::createEntityReference() - Create new entity reference node
- DOMDocument::createProcessingInstruction() - Crea un nuevo nodo PI
- DOMDocument::createTextNode() - Crea un nuevo nodo de texto
_ michael ¶
3 years ago
