2011-10-25 19 views
6

Tôi đang gặp một số sự cố khi biết chính xác những gì được lưu trữ trong ChildNodes. Lý tưởng nhất là tôi muốn làm một xquery trên mỗi nút con, nhưng dường như không thể làm cho nó thẳng. Đây là kịch bản của tôi: dữ liệu:Duyệt qua các nút con bằng DOMXpath PHP?

<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> 

Và mã:

$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? } 

Đối với mỗi phần tử của "cái gì đó" (ví dụ, $ n) Tôi muốn truy cập các giá trị của hai đoạn văn bản và href. Tôi đã thử sử dụng childNode và xquery khác nhưng không thể nhận được bất cứ điều gì để làm việc. Mọi sự trợ giúp sẽ rất được trân trọng!

Trả lời

10

Có bạn có thể chạy một truy vấn xpath, một cái gì đó như thế:

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

    echo $other_nodes->length; 
} 

Điều này sẽ giúp bạn có được div bên trong với somethingelse lớp, đối số thứ hai của $ xpath-> Phương pháp truy vấn nói để truy vấn để mất nút này như bối cảnh, xem chi tiết http://fr2.php.net/manual/en/domxpath.query.php

+0

Cảm ơn @TrexXx, nhưng khi tôi sử dụng "$ other_nodes-> nodeValue" Tôi không thấy gì cả. Điều đó không bắt đầu trở lại ở phần tử gốc? Ban đầu tôi nghĩ nó sẽ giống như thế này: '$ other_nodes = $ n-> query ('div [@ class =" somethingelse "]')'; – Bryan

+0

'$ other_nodes' là một danh sách nút, vì vậy trước tiên bạn sẽ phải nhận được một mục (một nút) và sau đó nhận được giá trị của nó. Một cái gì đó như '$ other_nodes-> item (0) -> nodeValue'. – TrexXx

+0

'$ other_nodes' kết thúc chứa thông tin từ bên ngoài' $ n' (tức là từ các yếu tố "thứ gì đó" khác); nó không phải là cách, phải không? Bạn có biết cách tiếp cận nào khác không yêu cầu quay lại truy vấn phần tử gốc không? – Bryan

3

Trexx đã có nó nhưng ông đã bỏ lỡ câu cuối cùng của câu hỏi:

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

Nếu tôi understan d câu hỏi của bạn một cách chính xác, nó làm việc khi tôi sử dụng hậu duệ :: biểu hiện. Hãy thử điều này:

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

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

Mặc dù đôi khi chỉ cần kết hợp truy vấn bằng cách sử dụng biểu thức đường dẫn // để thu hẹp tìm kiếm của bạn. Biểu thức // path chọn các nút trong tài liệu bắt đầu từ nút hiện tại khớp với bộ chọn.

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

Sau đó, lặp lại những thứ đó cho những thứ bạn cần. Hi vọng điêu nay co ich.

+0

Cảm ơn, tôi đã lặp lại để có được cha mẹ >> kết quả con, công việc này cho tôi – sarvesh

0

Đây là một đoạn mã cho phép bạn truy cập vào các thông tin chứa trong mỗi nút với thuộc tính lớp "cái gì đó":

$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);` 
Các vấn đề liên quan