2011-05-04 8 views
11

Domdocument PHP द्वारा डोम तत्वों का पहला स्तर कैसे प्राप्त करें? http: //stackoverflow.com/questions/1540302/how-to-get-nodes-in-first-level-using-php-domdocumentDomdocument PHP द्वारा डोम तत्वों का पहला स्तर कैसे प्राप्त करें?

क्यू & एक से tooken -

कि नहीं काम करता है कोड के साथ उदाहरण

<?php 
$str=<<< EOD 
<div id="header"> 
</div> 
<div id="content"> 
    <div id="sidebar"> 
    </div> 
    <div id="info"> 
    </div> 
</div> 
<div id="footer"> 
</div> 
EOD; 

$doc = new DOMDocument(); 
$doc->loadHTML($str); 
$xpath = new DOMXpath($doc); 
$entries = $xpath->query("/"); 
foreach ($entries as $entry) { 
    var_dump($entry->firstChild->nodeValue); 
} 
?> 

धन्यवाद, योसेफ

उत्तर

26

रूट नोड नीचे तत्वों का पहला स्तर

$dom->documentElement->childNodes 

साथ पहुँचा जा सकता childNodes संपत्ति एक 01 में शामिल, जिसे आप foreach के साथ पुन: सक्रिय कर सकते हैं।

देखें DOMDocument::documentElement

यह एक सुविधा विशेषता है कि बच्चे नोड दस्तावेज़ के दस्तावेज़ तत्व है कि के लिए सीधी पहुँच की अनुमति देता है।

और DOMNode::childNodes

एक DOMNodeList कि इस नोड के सभी बच्चों में शामिल है। अगर कोई बच्चा नहीं है, तो यह एक खाली डोमनोडलिस्ट है।

childNodes के बाद से DOMNode की संपत्ति किसी भी वर्ग DOMNode का विस्तार इस संपत्ति है (जो डोम में कक्षाओं के सबसे अधिक है), तो एक DOMElement नीचे तत्वों का पहला स्तर प्राप्त करने के लिए है कि DOMElement के childNode संपत्ति का उपयोग करने की है।


ध्यान दें कि यदि आप अमान्य HTML या आंशिक दस्तावेजों पर DOMDocument::loadHTML() का उपयोग करें, HTML पार्सर मॉड्यूल एचटीएमएल और शरीर टैग के साथ एक HTML कंकाल जोड़ देगा, तो डोम पेड़ में, अपने उदाहरण में HTML

हो जाएगा
<!DOCTYPE html … "> 
<html><body><div id="header"> 
</div> 
<div id="content"> 
    <div id="sidebar"> 
    </div> 
    <div id="info"> 
    </div> 
</div> 
<div id="footer"> 
</div></body></html> 

जो आपको XPath ट्रैवर्स या उपयोग करते समय ध्यान में रखना है। नतीजतन,

$dom = new DOMDocument; 
$dom->loadHTML($str); 
foreach ($dom->documentElement->childNodes as $node) { 
    echo $node->nodeName; // body 
} 

का उपयोग कर केवल <body> DOMElement नोड पुनरावृति होगी। यह जानकर कि libxml कंकाल जोड़ देगा, आपको अपने उदाहरण कोड से div तत्व प्राप्त करने के लिए <body> तत्व के बच्चे नोड्स पर पुन: सक्रिय करना होगा, उदा।

$dom->getElementsByTagName('body')->item(0)->childNodes 

हालांकि, ऐसा करने भी, किसी भी खाली स्थान के नोड्स को ध्यान में रखना होगा ताकि आप या तो झूठी या सही तत्व nodeType के लिए क्वेरी के लिए preserveWhiteSpace स्थापित करने के लिए सुनिश्चित करने के लिए है, तो आप केवल DOMElement नोड्स प्राप्त करना चाहते हैं, उदाहरण के लिए

foreach ($dom->getElementsByTagName('body')->item(0)->childNodes as $node) { 
    if ($node->nodeType === XML_ELEMENT_NODE) { 
     echo $node->nodeName; 
    } 
} 

या XPath का उपयोग

$dom->loadHTML($str); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('/html/body/*') as $node) { 
    echo $node->nodeName; 
} 

अतिरिक्त जानकारी:

संबंधित मुद्दे