如何在PHP中向DOMNodeList添加元素?

6
有没有方法可以创建自己的DOMNodeList?例如:
$doc = new DOMDocument(); 
$elem = $doc->createElement('div');
$nodeList = new DOMNodeList; 
$nodeList->addItem($elem); // ?

我的想法是扩展DOMDocument类,添加一些有用的方法,以DOM节点列表的形式返回数据。

是否可以在不编写自己的DOMNodeList类的情况下实现?

1个回答

3

您无法通过 公共接口DOMNodeList 添加项目。但是,当连接到 DOM 树时,DOMNodeLists 是实时集合,因此向 DOMElement 添加子元素将在该元素的子集合(即 DOMNodeList)中添加一个元素:

$doc = new DOMDocument();
$nodelist = $doc->childNodes; // a DOMNodeList
echo $nodelist->length;       // 0

$elem = $doc->createElement('div');
$doc->appendChild($elem);

echo $nodelist->length;       // 1

你说你想添加“一些返回数据为DOMNodeList的有用方法”。在DOMDocument的上下文中,这就是XPath所做的。它允许您查询文档中的所有节点并将它们作为DOMNodeList返回。也许这就是你要找的。

谢谢您的回答,解决了我的问题。我正在开发一个小型库原型,它为DOMDocument类添加CSS支持。它执行特定任务,例如查找具有透明度的图像的可见背景颜色(通过访问其<img>元素和父节点的CSS)。一旦我找到一个不错的将CSS选择器转换为XPath的转换器,我就会尝试使用XPath。 - optimizitor
@optimizitor 注意,已经有第三方库实现了这个功能。请参考https://dev59.com/EnA65IYBdhLWcg3w4C-j#3577662。 - Gordon
假设从加载的HTML中获取了 DOMNode $elem,是否有一种方法可以保存它的上下文(parentNodepreviousSiblingnextSibling)?当应用 DOMNode::appendChild(DOMNode $elem) 时,这些值会发生变化。 - optimizitor
@optimizitor 不确定我理解了没有。整个DOM是一个活结构。因此,您所做的一切操作(插入、删除等)都会立即反映在节点中。 - Gordon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接