2013-06-06 72 views
3

假設你有類似嵌套的DOM XPath?

<div> 
    <p>...</p> 
    <p>There are an unbounded number of these p tags</p> 
    <p>etc etc...could be 4 of these one time, then 9 the next time</p> 
</div> 
<div> 
    <p>Same here, an unbounded number</p> 
    <p>etc</p> 
</div> 
<div> 
    <p>And so on...</p> 
    <p>...</p> 
    <p>...</p> 
    <p>...</p> 
</div> 

假設我想搶到第一P個節點出了第一個div的,第二個P個節點出了第二個div的,進出第三div的第三P個節點。現在,如果這是XML,我會使用的SimpleXMLElement和做類似

foreach ($data->xpath('//div') as $cur){ 
     //Then work within each <div> that is returned, could even xpath this again if I needed to 
    } 

但是,怎樣才能選擇每個單獨的DIV然後在每個工作,或做相當於在DOM的XPath?如果我是說

$query = $data->query('//div'); 

我會得到DOMElements的名單,據我知道不能在另一個DOM的XPath使用(現在如果可能,將工作我想),所以我不能窩XPath請求或至少我沒有得到任何結果,當我嘗試使用nodeValue/textValue並創建一個新的DOMDocument和DOMXPath。 nodeValue/textValue似乎具有全部標籤,這就是爲什麼我認爲它沒有返回任何結果。

現在我可以在這種情況下用'\ n'分隔並解析nodeValue,但想象在每個div中每種類型的子節點都有無限數量的情況下,我們正在尋找一些說5級的東西。那會變成一個巨大的醜陋混亂。

基本上,SimpleXMLElement-> xpath保留了文檔結構,而DOM DOM似乎沒有出現。

那麼,有沒有一個很好的一般方法來做到這一點?

回答

5

您可以訪問嵌套元素。例如,如果你想從第二div第一段訪問文本,可以按如下方式做到這一點:

$doc = new DOMDocument(); 
if (! @$doc->loadHTML($html)){ 
    return FALSE; 
} 
$xpath = new DOMXPath($doc); 
$res = $xpath->query('//div'); 
$sub = $xpath->query('.//p', $res->item(1));//paragraphs of second div 
echo trim($sub->item(0)->nodeValue);//first paragraph 

注意$sub相對於存儲在$res第一查詢的查詢。

輸出是:

同樣在這裏,一個無限數量

+0

哦,HEMM,不知道爲什麼沒有早點工作時,我嘗試了,但感謝!一定是打錯了〜〜〜。 –

+0

不客氣。 –