PHP Conference Japan 2024

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 具有前缀并且 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