2012-03-03 23 views
5

Hasta el momento estoy trabajando en un archivo HTML como esteSeleccione el siguiente nodo del nodo seleccionado en PHP DOM?

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

deseo seleccionar el siguiente nodo de cada "div", que tiene su nombre igual a "nodo" y trato:

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

Pero apenas consigo un error

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

¿alguien puede decirme qué le pasa a mi guión por favor?

+0

creo que es 'nextSibling' – scibuff

Respuesta

15

El error es bastante claro: no hay un método DOMElement::next_sibling(). Lee el documentation for DOMElement y es la clase para padres DOMNode. Está pensando en la propiedad DOMNode::nextSibling.

Sin embargo, nextSibling Obtiene el siguiente nodo , no el siguiente elemento . (No hay ningún método o propiedad DOM que obtenga el siguiente elemento. Debe seguir usando nextSibling y consultar nodeType hasta que toque otro elemento). Su pregunta dice que desea el siguiente nodo, pero creo que en realidad puede desear el siguiente elemento (el vacío <div>). En realidad, esto es bastante fácil de hacer con XPath, ¿por qué no lo haces?

Para conseguirlo inmediatamente:

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

Para conseguirlo cuando ya tiene un <div name="node">:

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

Así es, quiero llegar al siguiente elemento de la señorita, pero sólo utiliza' nextSibling'. ¡Muchas gracias por su agradable explicación, el guión ahora funciona bien como se esperaba! – Teiv

5

No hay una función llamada next_sibling() en DOM. Debería usar la propiedad nextSibling definida en DOMNode (http://www.php.net/manual/en/class.domnode.php).

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

no sé php pero esto xpath ellos obtiene:

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

Ignorando nodos de texto (con suerte, no probado)

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

En función

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

Uso

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