CakeFest 2024: The Official CakePHP Conference

DOMDocument::createAttributeNS

(PHP 5, PHP 7, PHP 8)

DOMDocument::createAttributeNS Crée un nouvel attribut avec un espace de noms associé

Description

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

Cette fonction crée une nouvelle instance de la classe DOMAttr. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Liste de paramètres

namespace

L'URI de l'espace de noms.

qualifiedName

Le nom de la balise et le préfixe de l'attribut, sous cette forme : préfixe:nomBalise.

Valeurs de retour

Le nouveau DOMAttr ou false si une erreur survient.

Erreurs / Exceptions

DOM_INVALID_CHARACTER_ERR

Lancé si qualifiedName contient un caractère invalide.

DOM_NAMESPACE_ERR

Lancé si qualifiedName est un nom qualifié malformé ou si qualifiedName a un suffixe et que namespace est null.

Historique

Version Description
8.3.0 Appeler cette méthode sans spécifier un préfixe choisira désormais un préfixe au lieu de supposer l'espace de noms par défaut. Auparavant, cela créait un attribut sans préfixe et appliquait incorrectement l'espace de noms à l'élément propriétaire car les espaces de noms par défaut ne s'appliquent pas aux attributs.
8.3.0 Appeler cette méthode en utilisant un préfixe déjà déclaré sur l'élément propriétaire avec un URI d'espace de noms différent changera désormais le nouveau préfixe pour éviter de créer des conflits d'espace de noms. Cela aligne le comportement sur la spécification du DOM. Auparavant, cela déclenchait une DOMException avec le code DOM_NAMESPACE_ERR.

Voir aussi

add a note

User Contributed Notes 1 note

up
9
_ michael
13 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