如何通过索引获取PHP DOMDocument的子代

bin*_*680 9 php dom

我想要一个PHP DOMDocument的孩子.假设我有一个这样的DOM文档:

<div>
   <h1 ></h1>
   <div id=2></div>
   <div class="test"></div>
...
</div>
Run Code Online (Sandbox Code Playgroud)

我有一个索引号3.然后我需要得到元素<div class="test"></div>.在DOMDocument API中,没有类似的方法children(3).在那儿?我怎样才能让一个有索引的孩子?

lon*_*day 18

可以childNodes.这是DOM元素的一个属性,它包含一个包含所有元素子节点的NodeList.理想情况下你可以这样做$el->childNodes->item(2)(注意它是基于0的,而不是基于1,所以2是第三项).但是,这包括文本节点.因此很难预测您的节点将是多少.这可能不是最好的解决方案.

你可以使用alexn的解决方案(getElementsByTagName('*')->item(2)),但这又有它的缺点.如果您的节点有子节点,它们也将包含在选择中.这可能会导致您的计算失败.

我首选的解决方案是使用XPath:它可能是最稳定的解决方案,并不是特别难.

您需要在$xpath = new DOMXPath($document)某处创建一个XPath对象,$documentDOMDocument实例在哪里.我将假设这$el是父div节点,我们正在搜索的"上下文".

$node = $x->query('*', $el)->item(2);
Run Code Online (Sandbox Code Playgroud)

请注意,我们再次使用基于0的索引来查找选择中的哪个元素.在这里,我们只查看顶级子节点div,并*仅选择元素节点,因此不需要使用文本节点进行计算.


ale*_*exn 5

如果您使用DOMDocument,您可以使用getElementsByTagName('*')它返回包含文档中所有元素的DomNodeList.然后,您可以调用item以索引作为参数的函数:

$nodes = $dom->getElementsByTagName('*');
$targetNode = $nodes->item(3);
Run Code Online (Sandbox Code Playgroud)