如何通过索引
获取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)
这样的方法。在那儿?我怎样才能得到一个索引的孩子?
您可以使用childNodes
。这是一个DOM元素的属性,它包含一个包含所有元素的子元素的NodeList。理想情况下,你可以做$el->childNodes->item(2)
(注意它是基于0的,而不是基于1的,所以2是第三项)。但是,这包括文本节点。所以很难预测你的节点是多少。这可能不是最好的解决方案。
你可以用alexn's solution(getElementsByTagName('*')->item(2)
),但这又有它的缺点。如果您的节点有子节点,它们也将包含在选择中。这可能会导致您的计算失败。
我的首选解决方案是使用XPath:它可能是最稳定的解决方案,并不是特别困难。
您需要在某处创建一个包含$xpath = new DOMXPath($document)
的XPath对象,其中$document
是您的DOMDocument实例。我会认为$el
是父DIV节点,在“背景”,我们在所搜索。这,再次,我们使用基于0的索引来查找哪个元素
$node = $x->query('*', $el)->item(2);
注在选择它。在这里,我们只查看顶级div
的子节点,而*
只选择元素节点,因此不需要使用文本节点的计算。
+1为XPath,那真的是解决方案 – 2011-05-18 07:45:09
嗨,谢谢你的回答。我尝试了$ el-> childNode-> item(2)。它剥离了所有的html标签。我也尝试过$ x-> query('/ div/*',$ el) - > item(2);但是注意到子节点没有使用div修复......我需要动态地获取子级别级别下降,像序列索引1 3 4 0. – bingjie2680 2011-05-18 07:52:02
@Yijie是的,它应该只是'query('*',$ el)'。查看更新的答案。 – lonesomeday 2011-05-18 07:53:08
如果您使用DOMDocument,则可以使用getElementsByTagName('*')
,它将返回一个包含文档中所有元素的DomNodeList。然后,您可以调用item
函数,它接受一个索引作为参数:
$nodes = $dom->getElementsByTagName('*');
$targetNode = $nodes->item(3);
嗨,谢谢你的回答,你的解决方案从所有后代节点获取所有元素。并且所有的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)
你需要使用getElementByTag( 'DIV'),然后使用getAttribute( '类'),并把在if条件匹配类= '测试'。它确实需要一点RnD – 2011-05-18 07:14:29
*(相关)* [最佳方法解析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
可能的重复[如何通过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