2012-03-03 2 views
5

До сих пор я работаю на HTML файл, как этотВыберите следующий узел выбранного узла в PHP DOM?

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

Я хочу, чтобы выбрать следующий узел каждого «DIV», который имеет свое имя, равное «узел», и я стараюсь:

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

Но я получаю сообщение об ошибке

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

Может кто-нибудь сказать мне, что случилось с моим сценарием, пожалуйста?

+0

я считаю, что это 'nextSibling' – scibuff

ответ

15

Ошибка вполне понятна: нет способа DOMElement::next_sibling(). Прочитайте documentation for DOMElement и это родительский класс DOMNode. Вы думаете о propertyDOMNode::nextSibling.

Однако nextSibling получает следующий узел, а не следующий элемент. (Нет никакого метода или свойства DOM, который получает следующий элемент. Вам нужно продолжать использовать nextSibling и проверять nodeType, пока вы не нажмете на другой элемент.) В вашем вопросе говорится, что вы хотите следующий узел, но я думаю, что вам действительно может понадобиться следующий элемент (пустой <div>). На самом деле это довольно легко сделать с XPath, так почему бы вам не сделать это вместо этого?

Чтобы получить его сразу:

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

Чтобы получить его, когда у вас уже есть <div name="node">:

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

Это верно, я хочу, чтобы получить следующий элемент, но просто избегаю используется' nextSibling'. Большое вам спасибо за хорошее объяснение, скрипт работает нормально, как и ожидалось! – Teiv

5

В DOM нет функции, называемой next_sibling(). Вы должны использовать свойство nextSibling, определенное в DOMNode (http://www.php.net/manual/en/class.domnode.php).

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

Я не знаю, но это phpxpath получает их:

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

Игнорирование текстовых узлов (надеюсь, не проверено)

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

В функции

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

Использование

foreach($els as $el) 
{ 
    if(nextElement($el,'div')) $j++; 
} 
Смежные вопросы