如何通过索引

问题描述:

获取PHP DOMDocument的子项我正在试图获取PHP DOMDocument的子项。说我有一个DOM文档是这样的:如何通过索引

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

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

+0

你需要使用getElementByTag( 'DIV'),然后使用getAttribute( '类'),并把在if条件匹配类= '测试'。它确实需要一点RnD ​​ – 2011-05-18 07:14:29

+0

*(相关)* [最佳方法解析HTML](http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662)和[Noob问题关于在DOM中的DOMDocument](http://stackoverflow.com/questions/4979836/noob-question-about-domdocument-in-php/4983721#4983721) – Gordon 2011-05-18 07:17:26

+0

可能的重复[如何通过Domdocument PHP获得第一级dom元素? ](http://stackoverflow.com/questions/5882433/how-get-first-level-of-dom-elements-by-domdocument-php) – Gordon 2011-05-18 07:22:39

可以使用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节点,在“背景”,我们在所搜索。这,再次,我们使用基于0的索引来查找哪个元素

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

注在选择它。在这里,我们只查看顶级div的子节点,而*只选择元素节点,因此不需要使用文本节点的计算。

+0

+1为XPath,那真的是解决方案 – 2011-05-18 07:45:09

+0

嗨,谢谢你的回答。我尝试了$ el-> childNode-> item(2)。它剥离了所有的html标签。我也尝试过$ x-> query('/ div/*',$ el) - > item(2);但是注意到子节点没有使用div修复......我需要动态地获取子级别级别下降,像序列索引1 3 4 0. – bingjie2680 2011-05-18 07:52:02

+0

@Yijie是的,它应该只是'query('*',$ el)'。查看更新的答案。 – lonesomeday 2011-05-18 07:53:08

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

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

嗨,谢谢你的回答,你的解决方案从所有后代节点获取所有元素。并且所有的html标签都被分离出来。我的目的是让孩子的水平下降一系列索引像1 3 4 0.希望这是明确的。 – bingjie2680 2011-05-18 07:46:05

试试这个

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

现在你可以匹配特定的div class或id属性,做什么都。 这不是解决方案,但可以帮助您找到所有div的内容和属性。希望能帮助到你。

试试这个:

$dom->childNodes->item(3)