簡體   English   中英

如何通過索引獲取PHP DOMDocument的子代

[英]How to get a child of PHP DOMDocument by index

我想要一個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的解決方案getElementsByTagName('*')->item(2) ),但這又有它的缺點。 如果您的節點有子節點,它們也將包含在選擇中。 這可能會導致您的計算失敗。

我首選的解決方案是使用XPath:它可能是最穩定的解決方案,並不是特別難。

您需要在某處創建一個帶有$xpath = new DOMXPath($document)的XPath對象,其中$document是您的DOMDocument實例。 我將假設$el是父div節點,我們正在搜索的“上下文”。

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

請注意,我們再次使用基於0的索引來查找選擇中的哪個元素。 在這里,我們只查看頂級div子節點, *僅選擇元素節點,因此不需要使用文本節點進行計算。

如果使用DOMDocument,則可以使用getElementsByTagName('*')返回包含文檔中所有元素的DomNodeList。 然后,您可以調用以索引作為參數的item函數:

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

試試這個

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

現在,您可以匹配該特定div的class或id屬性,並執行任何操作。 這不是解決方案,但可以幫助您找到所有div的內容和屬性。 希望能幫助到你。

試試這個:

$dom->childNodes->item(3)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM