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

时间:2011-05-18 07:08:06

标签: php dom

我正在尝试获取PHP DOMDocument的子代。假设我有一个这样的DOM文档:

<div>
   <h1 ></h1>
   <div id=2></div>
   <div class="test"></div>
...
</div>

我的索引号为3.然后我需要获取元素<div class="test"></div>。在DOMDocument API中,没有像children(3)这样的方法。在那儿?如何让孩子获得索引?

4 个答案:

答案 0 :(得分:18)

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

你可以选择alexn's solutiongetElementsByTagName('*')->item(2)),但这也有其缺点。如果您的节点有子节点,它们也将包含在选择中。这可能会导致您的计算失败。

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

您需要在某处创建一个$xpath = new DOMXPath($document)的XPath对象,其中$document是您的DOMDocument实例。我将假设$el是父div节点,我们正在搜索的“上下文”。

$node = $x->query('*', $el)->item(2);

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

答案 1 :(得分:5)

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

$nodes = $dom->getElementsByTagName('*');
$targetNode = $nodes->item(3);

答案 2 :(得分:1)

试试这个

 foreach($dom->getElementsByTagName('div') as $div) { 
        $class = $div->getAttribute('class');
    } 

现在您可以匹配该特定div的class或id属性并执行任何操作。 这不是解决方案,但可以帮助您找到所有div的内容和属性。希望能帮助到你。

答案 3 :(得分:0)

试试这个:

$dom->childNodes->item(3)