2012-03-03 25 views
5

Cho đến nay tôi đang làm việc trên một file HTML như thế nàyChọn nút tiếp theo của nút đã chọn trong PHP DOM?

<div name="node"></div> 
<div></div> 
<div name="node"></div> 
<div></div> 
<div name="node"></div> 
<div></div> 

Tôi muốn chọn nút tiếp theo của mỗi "div" trong đó có tên của nó bằng "nút" và tôi cố gắng:

$dom = new DOMdocument(); 
@$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 

$els = $xpath->query("//div[@name='node']"); 

$j = 0; 

foreach($els as $el) 
{ 
    if($el->next_sibling()) $j++; 
} 

echo $j; 

Nhưng tôi chỉ nhận được một lỗi

Fatal error: Call to undefined method DOMElement::next_sibling()

ai có thể cho tôi biết những gì xảy ra với kịch bản của tôi xin vui lòng?

+0

tôi tin rằng đó là 'nextSibling' – scibuff

Trả lời

15

Lỗi này khá rõ ràng: không có phương pháp DOMElement::next_sibling(). Đọc số documentation for DOMElement và đó là lớp cha mẹ DOMNode. Bạn đang nghĩ đến thuộc tính DOMNode::nextSibling.

Tuy nhiên, nextSibling nhận nút tiếp theo, không phải thành phần tiếp theo. (Không có phương thức DOM hoặc thuộc tính nào nhận phần tử tiếp theo. Bạn cần tiếp tục sử dụng nextSibling và kiểm tra nodeType cho đến khi bạn nhấn một phần tử khác.) Câu hỏi của bạn cho biết bạn muốn nút tiếp theo nhưng tôi nghĩ bạn thực sự muốn phần tử tiếp theo trống <div>). Điều này thực sự khá dễ dàng để làm với XPath, vậy tại sao bạn không làm điều đó thay thế?

Để có được nó ngay lập tức:

$els = $xpath->query("//div[@name='node']/following-sibling::*[1]"); 

Để có được nó khi bạn đã có một <div name="node">:

$nextelement = $xpath->query("following-sibling::*[1]", $currentdiv); 
+0

Đúng vậy, tôi muốn để có được những yếu tố tiếp theo nhưng chỉ lỡ sử dụng' nextSibling'. Cảm ơn bạn rất nhiều vì lời giải thích tốt đẹp của bạn kịch bản bây giờ làm việc tốt như mong đợi! – Teiv

5

Không có hàm nào được gọi là next_sibling() trong DOM. Bạn nên sử dụng thuộc tính nextSibling được định nghĩa trong DOMNode (http://www.php.net/manual/en/class.domnode.php).

foreach($els as $el) 
{ 
    if($el->nextSibling) $j++; 
} 
4

Tôi không biết php nhưng xpath này được chúng:

//div[@name="node"]/following-sibling::*[1] 
0

Bỏ qua các nút văn bản (hy vọng, không được kiểm tra)

foreach($els as $el){ 
    $next = $el->nextSibling; 
    while($next){ 
    if($next->nodeType!==3){ 
     $j++; 
     break; 
    } 
    $next = $next->nextSibling; 
    } 
} 

Là một chức năng

function nextElement($node, $name=null){ 
    if(!$node){ 
     return null; 
    } 
    $next = $node->nextSibling; 
    if(!$next){ 
     return null; 
    } 
    if($next->nodeType === 3){ 
     return self::nextElement($next, $name); 
    } 
    if($name && $next->nodeName !== $name){ 
     return null; 
    } 
    return $next; 
} 

Cách sử dụng

foreach($els as $el) 
{ 
    if(nextElement($el,'div')) $j++; 
} 
Các vấn đề liên quan