2012-03-03 16 views
5

अब तक मैं इसPHP डोम में चयनित नोड का अगला नोड चुनें?

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

मैं हर "div" जो अपने नाम के बराबर है की अगले नोड का चयन करना चाहते की तरह एक HTML फ़ाइल पर काम कर रहा हूँ "नोड" और करने के लिए मैं कोशिश:

$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 पढ़ें। आप संपत्तिDOMNode::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

डीओएम में next_sibling() नामक फ़ंक्शन नहीं है। आपको DOMNode (http://www.php.net/manual/en/class.domnode.php) में परिभाषित अगली सिब्लिंग की संपत्ति का उपयोग करना चाहिए।

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

मैं php पता नहीं है, लेकिन इस xpath उन्हें हो जाता है:

//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++; 
} 
संबंधित मुद्दे