2013-05-04 3 views
2

다음 두 번째 ul의 li 태그 만 추출하려고합니다. 불행하게도, 어떤 클래스 나 ID는 (사실, 몇 가지) 내가 시도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> 

도움이되는 HTML에 없다 :

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

나에게 두 번째 UL을 얻을 것이다이 생각하고 I 거기에서 추출 할 수 있습니다. 그것은 두 번째 ul의 html을 얻지 만, 분명히`-> evaluate을 사용하여 뭔가를 오해하고있는 것입니까? 왜냐하면 제 리가 단지 두 번째 울 에서뿐만 아니라 모든 리입니다.

답변

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

아니, 그게 둘 다에 대한 두 번째 li을 제공합니다 - 나는 두 번째 ul에서 모든 리튬을 원합니다 – jmadsen

+0

오케이 .. 오해 .. 두 번째 ... – hek2mgl

+1

하지만 어쨌든 나에게 대답을주었습니다 :-) // ul [ 2]/li 감사합니다 – jmadsen

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'도 사용할 수 있습니다. 파일 시스템처럼. 당신은 선도적 인'. /' – hek2mgl

+0

AFAIK를 simplexml xpath에 필요로하지 않을 것입니다. domxpath에서 항상 그렇다면 완전히 확신 할 수는 없습니다. 그래서 저는 종종 점으로 사용합니다. 기술적으로'li'을 사용하는 것만으로 context-node를 기준으로 올바른 xpath 여야합니다. 그렇습니다. – hakre

+0

같은'libxml'에 대해 simplexml이 링크되어 있기 때문에 실제로 상상할 수 없습니다. 시도해야합니다. 어쩌면 당신은'. /'미래를 살릴거야.) – hek2mgl