2013-05-04 223 views
2

我想從下面只提取第二個ul的li標籤。不幸的是,有沒有類或ID在HTML幫助domxpath - 從第二個ul中提取li標籤

<ul> 
    <li>Some text</li> 
    <li>Some text</li> 
    <li>Some text</li> 
</ul> 

<ul> 
    <li>Some more text</li> 
    <li>Some more text</li> 
    <li>Some more text</li> 
</ul> 

我已經試過(幾件事情,其實):

$ul = $xpath->query('//ul')->item(1); 
    $query = '/li'; 
    $lis = $xpath->evaluate($query, $ul); 

想這會讓我的第二UL,然後我可以從那裏提取。它確實讓我獲得了第二個ul的html,但是我顯然誤解了用' - >評估的東西?因爲我的李是所有的李,而不僅僅是第二個UL。

回答

5

您可以使用XPath直接訪問它們:

$xpath->query('//ul[2]/li'); 

例子:

$html = <<<EOF 
<ul> 
    <li>Some text</li> 
    <li>Some text</li> 
    <li>Some text</li> 
</ul> 

<ul> 
    <li>Some more text</li> 
    <li>Some more text</li> 
    <li>Some more text</li> 
</ul> 
EOF; 

$doc = new DOMDocument(); 
$doc->loadHTML($html); 

$selector = new DOMXpath($doc); 

// iterate through them... 
foreach($selector->query('//ul[2]/li') as $li) { 
    echo $li->nodeValue . PHP_EOL; 
} 

+0

不,這給了我第二個李爲兩個 - 我想要所有李的第二個ul – jmadsen 2013-05-04 09:38:11

+0

好吧..誤解..第二個...... – hek2mgl 2013-05-04 09:38:52

+1

但是,無論如何,你給了我答案:-) // ul [ 2]/li謝謝 – jmadsen 2013-05-04 09:39:10

2

如果你想使用上下文節點(在你的問題),加前面的一個點(xpath中的點是當前節點)相對於上下文節點,不會上升到根:

$query = './li'; 
      # 
$lis = $xpath->evaluate($query, $ul); 

或者只是沒有在前面的斜線:

$query = 'li';    
$lis = $xpath->evaluate($query, $ul); 

見以及/比擬的:Search by XPath under a given element

+0

你說的是正確的。但你也可以使用'li'。就像在文件系統中一樣。您將不需要在simplexml xpath中使用前導''/' – hek2mgl 2013-05-04 09:47:40

+0

AFAIK是的,在domxpath中,我不完全確定這是否始終如此。所以我經常使用點。技術上只使用'li'應該是相對於上下文節點正確的xpath,是的。 – hakre 2013-05-04 09:48:41

+0

無法真正想象simplexml與相同的'libxml'鏈接..你應該嘗試一下。或許你會在將來保存一些'。/';) – hek2mgl 2013-05-04 09:51:16