2011-10-25 2 views
6

childNodes에 정확히 무엇이 저장되어 있는지 이해하는 데 어려움을 겪고 있습니다. 이상적으로 나는 각각의 자식 노드에서 다른 xquery를하고 싶지만 그것을 똑바로 가져올 수는 없다. 여기 내 시나리오는 다음과 같습니다 데이터 :PHP DOMXpath를 사용하여 하위 노드를 탐색 하시겠습니까?

<div class="something"> 
    <h3> 
     <a href="link1.html">Link text 1</a> 
    </h3> 
    <div class"somethingelse">Something else text 1</div> 
</div> 
<div class="something"> 
    <h3> 
     <a href="link2.html">Link text 2</a> 
    </h3> 
    <div class"somethingelse">Something else text 2</div> 
</div> 
<div class="something"> 
    <h3> 
     <a href="link3.html">Link text 3</a> 
    </h3> 
    <div class"somethingelse">Something else text 3</div> 
</div> 

그리고 코드 : "뭔가"의 각 요소에 대해

$html = new DOMDocument(); 
$html->loadHtmlFile($local_file); 
$xpath = new DOMXPath($html); 
$nodelist = $xpath->query("//div[@class='something']"); 
foreach ($nodelist as $n) { 
    Can I run another query here? } 

(즉, $ n을) 나는 텍스트의 두 가지의 값에 액세스 할 및 href. childNode와 다른 xquery를 사용해 보았지만 아무 것도 할 수 없었습니다. 어떤 도움이라도 대단히 감사하겠습니다! 그런

답변

10

예를 다른 XPath 쿼리를 실행할 수 있습니다, 뭔가 :

foreach ($nodelist as $n) 
{ 
    $other_nodes = $xpath->query('div[@class="somethingelse"]', $n); 

    echo $other_nodes->length; 
} 

이 당신에게 클래스 SOMETHINGELSE와 내부 사업부를 얻을 것이라고 $ xpath-의 두 번째 인수는> 쿼리 방법에 쿼리 알려줍니다 참조, 문맥 등이 노드을 더 http://fr2.php.net/manual/en/domxpath.query.php

+0

감사 @TrexXx :하지만, 여기에 – Bryan

+0

'$ other_nodes'는 노드 목록이므로 먼저 항목 (노드)을 가져 와서 그 값을 얻어야합니다. '$ other_nodes-> item (0) -> nodeValue'와 같은 것입니다. – TrexXx

+0

'$ other_nodes'는'$ n' 외부의 정보 (즉, 다른 "something"요소)를 포함합니다. 그건 안된다, 그렇지? 루트 요소를 쿼리하기 위해 돌아갈 필요가없는 다른 접근법을 알고 있습니까? – Bryan

3

Trexx가 있었다 그러나 그는 질문의 마지막 문장 놓친 :

foreach ($nodelist as $n){ 
    $href = $xpath->query('h3/a', $n)->item(0)->getAttribute('href'); 
    $a_text = $xpath->query('h3/a', $n)->item(0)->nodeValue; 
    $div_text = $xpath->query('div', $n)->item(0)->nodeValue; 
} 
2

내가 understan 경우를 d 귀하의 질문을 올바르게, 그것은 descendant :: expression 사용할 때 작동했습니다. 이 시도 :

foreach ($nodelist as $n) { 
    $other_nodes = $xpath->query('descendant::div[@class="some-descendant"]', $n); 

    echo $other_nodes->length; 
    echo $other_nodes->item(0)->nodeValue; 
} 

를 때때로 충분히 검색을 좁히기위한 // 경로 표현식을 사용하여 쿼리를 결합 비록. // 경로 표현식은 선택자와 일치하는 현재 노드에서 시작하여 문서에서 노드를 선택합니다.

$nodes = $xpath->query('//div[@class="some-descendant"]//div[@class="some-descendant-of-that-descendant"]'); 

그런 다음 필요한 항목을 반복하십시오. 희망이 도움이됩니다. 나는 "$ other_nodes-> nodeValue를"사용할 때

$nodes_tracker = 0; 
$nodes_array = array(); 
foreach($nodelist as $n){ 
    $info = $xpath->query('//h3//a', $n)->item($nodes_tracker)->nodeValue; 
    $extra_info = $xpath->query('//div[@class="somethingelse"', $n)->item($nodes_tracker)->nodeValue; 
    array_push($nodes_array, $info. ' - '. $extra_info . '<br>'); //Add each info to array 
    $nodes_tracker++; 
} 
print_r($nodes_array);` 
+0

감사합니다. 부모 >> 자녀 결과를 얻으려고 루핑되었습니다.이 작업은 저에게 맞습니다. – sarvesh

0

는 "뭔가"클래스 속성이 각 노드에 포함 된 정보에 액세스 할 수있는 코드입니다 나는 아무것도 보지 못한다. 루트 요소에서 다시 시작하지 않습니까? 나는 원래 다음과 같이 될 것이라고 생각했다 :`$ other_nodes = $ n-> query ('div [@ class = "somethingelse"]')`;
관련 문제