2011-05-18 76 views
9

獲取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

回答

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節點,在「背景」,我們在所搜索。這,再次,我們使用基於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

4

如果您使用DOMDocument,則可以使用getElementsByTagName('*'),它將返回一個包含文檔中所有元素的DomNodeList。然後,您可以調用item函數,它接受一個索引作爲參數:

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

嗨,謝謝你的回答,你的解決方案從所有後代節點獲取所有元素。並且所有的html標籤都被分離出來。我的目的是讓孩子的水平下降一系列索引像1 3 4 0.希望這是明確的。 – bingjie2680 2011-05-18 07:46:05

1

試試這個

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

現在你可以匹配特定的div class或id屬性,做什麼都。 這不是解決方案,但可以幫助您找到所有div的內容和屬性。希望能幫助到你。

0

試試這個:

$dom->childNodes->item(3)