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

返回值

新的 DOMAttrfalse 如果发生错误。

错误/异常

DOM_INVALID_CHARACTER_ERR

如果 qualifiedName 包含无效字符,则引发。

DOM_NAMESPACE_ERR

如果 qualifiedName 是格式错误的限定名称,或者如果 qualifiedName 有前缀而 namespacenull,则引发。

变更日志

版本 描述
8.3.0 现在,在不指定前缀的情况下调用此方法将选择一个前缀,而不是假设默认命名空间。以前,这将创建一个没有前缀的属性,并将命名空间错误地应用于所有者元素,因为默认命名空间不适用于属性。
8.3.0 现在,使用已经在所有者元素上使用不同命名空间 URI 声明的前缀调用此方法将更改新前缀以避免创建命名空间冲突。这将行为与 DOM 规范对齐。以前,这将抛出一个代码为 DOM_NAMESPACE_ERRDOMException

参见

添加笔记

用户贡献的笔记 1 个笔记

10
_ michael
14 年前
如果在创建和插入属性时引入了新的命名空间,则 createAttributeNS() 的行为与 createElementNS() 不同。

(1) 位置:使用 createAttributeNS(),新命名空间是在文档元素级别声明的。相比之下,createElementNS() 在受影响的元素本身的级别声明了新的命名空间。

(2) 时间:使用 createAttributeNS(),新命名空间在创建属性时立即在文档中声明 - 属性实际上不需要被插入。createElementNS() 在元素未插入之前不会影响文档。

一个例子

<?php

$source
= <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root><tag></tag></root>
XML;

/*

I. createAttributeNS:
* 新的命名空间会立即出现,即使没有插入属性
* 新的命名空间是在文档元素级别声明的

*/

$doc = new DOMDocument( '1.0' );
$doc->loadXML( $source );

// (1) 我们只创建一个“命名空间”属性,而不将其附加到任何元素。
$attr_ns = $doc->createAttributeNS( '{namespace_uri_here}', 'example:attr' );

print
$doc->saveXML() . "\n";

/*
结果:命名空间声明出现,已添加到文档元素。输出:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:example="{namespace_uri_here}"><tag/></root>

*/

// (2) 接下来,我们为属性赋值并将其插入。
$attr_ns->value = 'value';
$doc->getElementsByTagName( 'tag' )->item(0)->appendChild( $attr_ns );

print
$doc->saveXML() . "\n";

/*
结果:“命名空间”属性也出现了。输出:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:example="{namespace_uri_here}"><tag example:attr="value"/></root>

*/

/*

II. createElementNS:
* 新的命名空间仅在插入元素时才会出现
* 新的命名空间是在插入的元素级别声明的

*/

$doc = new DOMDocument( '1.0' );
$doc->loadXML( $source );

// (1) 我们创建一个“命名空间”元素,而不将其插入文档中。
$elem_ns = $doc->createElementNS( '{namespace_uri_here}', 'example:newtag' );

print
$doc->saveXML() . "\n";

/*
结果:文档保持不变。输出:

<?xml version="1.0" encoding="UTF-8"?>
<root><tag/></root>

*/

// (2) 接下来,我们插入新元素。
$doc->getElementsByTagName( 'tag' )->item(0)->appendChild( $elem_ns );

print
$doc->saveXML() . "\n";

/*
结果:命名空间声明出现,它被嵌入到使用它的元素中。输出:

<?xml version="1.0" encoding="UTF-8"?>
<root><tag><example:newtag xmlns:example="{namespace_uri_here}"/></tag></root>

*/

?>
To Top