DOMNamedNodeMap 类

(PHP 5, PHP 7, PHP 8)

类概要

class DOMNamedNodeMap implements IteratorAggregate, Countable {
/* 属性 */
public readonly int $length;
/* 方法 */
public count(): int
public getNamedItem(string $qualifiedName): ?DOMNode
public getNamedItemNS(?string $namespace, string $localName): ?DOMNode
public item(int $index): ?DOMNode
}

属性

length

映射中节点的数量。有效子节点索引的范围是 0length - 1(包含)。

变更日志

版本 描述
8.0.0 未实现的方法 DOMNamedNodeMap::setNamedItem()DOMNamedNodeMap::removeNamedItem()DOMNamedNodeMap::setNamedItemNS()DOMNamedNodeMap::removeNamedItem() 已被移除。
8.0.0 DOMNamedNodeMap 现在实现了 IteratorAggregate。以前,实现的是 Traversable

目录

添加注释

用户贡献的注释 3 个注释

7
kendsnyder at gmail dot com
14 年前
补充 xafford 的评论。当使用 ->item() 或使用 foreach 迭代命名节点映射集合时,使用 DOMNode->removeAttribute() 或 DOMNode->removeAttributeNode() 删除属性会像堆栈一样改变集合。为了说明,下面的代码试图从每个元素中删除所有属性,但只删除了第一个。一种解决方法是在删除属性之前将命名节点映射复制到数组中。使用 Windows XP 上的 PHP 5.2.9。

<?php
error_reporting
(E_ALL);
$html = '<h1 id="h1test" class="h1test">Heading</h1>';
$html .= '<p align="left" class="ptest">Hello World</p>';

$doc = new DOMDocument();
$doc->loadHTML($html);

// 从 h1 元素中删除属性
$h1 = $doc->getElementsByTagName('h1')->item(0);
$length = $h1->attributes->length;
for (
$i = 0; $i < $length; ++$i) {
$name = $h1->attributes->item($i)->name;
$h1->removeAttribute($name);
echo
"h1: removed attribute `$name`<br>";
}
// 从 p 元素中删除属性
$p = $doc->getElementsByTagName('p')->item(0);
foreach (
$p->attributes as $name => $attrNode) {
$p->removeAttribute($name);
echo
"p: removed attribute `$name`<br>";
}

?>

输出
-------
h1: removed attribute `id`

Notice: Trying to get property of non-object in nodemap.php on line 13
h1: removed attribute ``
p: removed attribute `align`
7
xafford
14 年前
我偶然发现了 DOMNamedNodeMap 的一个问题。如果使用 foreach 迭代 DOMNamedNodeMap,它表示 DOMElement 的属性,并且使用 DOMElement::removeAttributeNode,则只会处理第一个属性。

示例(不完整)

<?php

/*
* 想象一下,你得到了一个这样的节点:
* <a onclick="alert('evil')" href="http://example.com">evil</a>
* 并且 onclick 应该被删除,href 将不会被测试。
*/

foreach ( $node->attributes as $attribute )
{

echo
'checking attribute ', $attribute->name, '<br />';

if ( !
in_array ( $attribute->name, $allowed_attributes ) )
{
$node->removeAttributeNode ( $attribute );
}

}

?>

输出将是

checking attribute onclick
4
sirajshaikh96 at yahoo dot com
3 年前
在执行 DOMNamedNodeMap 中的 for/foreach 循环时,我尝试解决了一个普遍问题:在执行 `removeAttribute('$name')` 移除 item(0) 后,item(1) 无法执行并出现警告。以下代码提供了解决此问题的方案:在循环中,应应用 item(0) 而不是 item($i),因为在移除第一个属性节点后,当前元素只有一个属性节点。

<?php
$html
= '<h1 id="h1test" class="h2test">Heading</h1>';
$html .= '<p align="left" class="right">Hello World</p>';

$doc = new DOMDocument();
$doc->loadHTML($html);

// 从 h1 元素中移除属性
$h1 = $doc->getElementsByTagName('h1')->item(0);
$length = $h1->attributes->length;
for (
$i = 0; $i < $length; $i++) {
$name = $h1->attributes->item(0)->nodeName;
$value = $h1->attributes->item(0)->nodeValue;
$h1->removeAttribute($name);
echo
"h1: removed attribute name :- " .$name."</br>";
echo
"h1: removed attribute value :- " .$value."</br>";
}
// 从 p 元素中移除属性
$p = $doc->getElementsByTagName('p')->item(0);
for (
$i = 0; $i < $length; $i++) {
$name = $p->attributes->item(0)->nodeName;
$value = $p->attributes->item(0)->nodeValue;
$p->removeAttribute($name);
echo
"p: removed attribute name :- " .$name."</br>";
echo
"p: removed attribute value :- " .$value."</br>";
}
?>

输出

h1: removed attribute name :- id
h1: removed attribute value :- h1test
h1: removed attribute name :- class
h1: removed attribute value :- h2test
p: removed attribute name :- align
p: removed attribute value :- left
p: removed attribute name :- class
p: removed attribute value :- right
To Top