2012-03-03 4 views
5

Şimdiye kadar ben eşit adını olan her "div" bir sonraki düğümü seçmek istediğiniz buPHP DOM'da seçilen düğümün bir sonraki düğümünü seçin.

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

gibi bir HTML dosyası üzerinde çalışıyorum ve "düğüm" I deneyin:

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

Ama sadece bir hata alıyorum

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

herkes senaryom yanlış lütfen ne söyleyebilir?

+0

ben doğru 'nextSibling' – scibuff

cevap

15

Hata çok açık: DOMElement::next_sibling() yöntem yok. documentation for DOMElement'u okuyun ve üst sınıfı DOMNode'dur. mülkünüDOMNode::nextSibling düşünürsünüz.

Ancak nextSibling sonraki düğüm, gelecek elemanı alır. (Bir sonraki öğeyi alan DOM yöntemi veya özelliği yoktur. Başka bir öğeye ulaşana kadar nextSibling'u kullanmaya devam etmeli ve nodeType'u denetlemelisiniz.) Sorunuz bir sonraki düğümü istiyor ancak sanırım bir sonraki öğeyi gerçekten isteyebilirsiniz. boş <div>). Bu aslında XPath ile yapmak oldukça kolay, o zaman neden bunu yapmıyorsunuz? Zaten bir <div name="node"> varken bunu elde etmek için

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

:

hemen almak için

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

inanmak gibi

foreach($els as $el){ $next = $el->nextSibling; while($next){ if($next->nodeType!==3){ $j++; break; } $next = $next->nextSibling; } } 
, sonraki eleman almak istiyorum ama sadece' nextSibling' kullanılan özledim. Güzel açıklamanız için çok teşekkür ederim, senaryo şimdi beklendiği gibi iyi çalışıyor! – Teiv

5

DOM'de next_sibling() işlevi bulunmuyor. DOMNode'da tanımlanan nextSibling özelliğini kullanmalısınız (http://www.php.net/manual/en/class.domnode.php).

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

Ben php bilmiyorum ama bu xpath onları alır:

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

Metin düğümlerini göz ardı etme (umarız, test edilmedi)bir fonksiyonu

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

Kullanımı

foreach($els as $el) 
{ 
    if(nextElement($el,'div')) $j++; 
}