2012-03-06 10 views
11

के साथ लौटा रही है, मैं अपने बच्चे के टैग नामों के साथ एक HTML पृष्ठ के शरीर की सामग्री निकालना चाहता हूं। मैं इस तरह एक उदाहरण एचटीएमएल ले लिया है:php DOMDocument nodeName प्रॉपर्टी '#text' को नोडनाम

<html> 
<head></head> 
<body> 
<h1>This is H1 tag</h1> 
<h2>This is H2 tag</h2> 
<h3>This is H3 tag</h3> 
</body> 
</html> 

मैं नीचे और उसके काम कर ठीक तरह php कोड लागू किया है।

$d=new DOMDocument(); 
$d->loadHTMLFile('file.html'); 
$l=$d->childNodes->item(1)->childNodes->item(1)->childNodes; 
for($i=0;$i<$l->length;$i++) 
{ 
echo "<".$l->item($i)->nodeName.">".$l->item($i)->nodeValue."</".$l->item($i)->nodeName.">"; 
} 

इस कोड को बिल्कुल ठीक काम कर रहा है, लेकिन जब मैं इस का उपयोग कर foreach के बजाय पाश पाश के लिए करने की कोशिश की, nodename संपत्ति हर वास्तविक nodename साथ '#text' लौट रहा था। यहां कोड

$l=$d->childNodes->item(1)->childNodes->item(1)->childNodes; 
foreach ($l as $li) { 
    echo $li->childNodes->item(0)->nodeName."<br/>"; 
} 

ऐसा क्यों है?

उत्तर

13

डोम में, सबकुछ एक 'नोड' है। न केवल तत्व (टैग); तत्वों के बीच टिप्पणियां और पाठ (भले ही यह केवल सफेद जगह या न्यूलाइन है, जो आपके उदाहरण में मामला प्रतीत होता है) भी नोड्स हैं। चूंकि टेक्स्ट नोड्स में वास्तविक नोड नाम नहीं है, इसलिए यह #text के साथ प्रतिस्थापित किया गया है ताकि यह इंगित किया जा सके कि यह एक विशेष प्रकार का नोड है।

स्पष्ट रूप से, item विधि के साथ मैन्युअल रूप से बाल नोड्स का चयन करते समय टेक्स्ट नोड्स छोड़े जाते हैं, लेकिन DOMNodeList पर पुनरावृत्त करते समय शामिल होते हैं। मुझे यकीन नहीं है कि कक्षा इस तरह क्यों व्यवहार करती है, किसी और को इसका जवाब देना होगा।

nodeName और nodeValue बगल में, एक DOMNode भी एक nodeType संपत्ति है। इस संपत्ति को certain constants के विरुद्ध जांचकर आप नोड के प्रकार को निर्धारित कर सकते हैं और इस प्रकार अवांछित नोड्स को फ़िल्टर कर सकते हैं।

+0

पता लगाया गया है कि आप अगली एलीमेंट सिब्लिंग के साथ अगले एसआईबीलिंग झगड़ा को हल कर सकते हैं! अरे आप ↵ और Leo

4

मैं इसके लिए थोड़ा देर से आ रहा हूं लेकिन मेरे लिए सबसे अच्छा समाधान अलग था। मुद्दा यह है कि टेक्स्ट नोड को इसका नाम नहीं पता है, लेकिन उसके माता-पिता ऐसा करते हैं, आपको यह जानने की ज़रूरत है कि यह कुंजी प्राप्त करने के लिए अपने माता-पिता को नोडवेल्यू के लिए पूछें।

$dom = new DOMDocument(); 
$dom->loadXML($stringXML); 
$valorizador = $dom->getElementsByTagName("tagname"); 
foreach ($valorizador->item(0)->childNodes as $item) { 
    $childs = $item->childNodes; 
    $key = $item->nodeName; 
    foreach ($childs as $i) { 
    echo $key." => ".$i->nodeValue. "\n"; 
    } 
} 
14

जब मुझे यह समस्या हुई तो इसे निम्नलिखित करके ठीक किया गया।

$xmlDoc = new DOMDocument(); 
$xmlDoc->preserveWhiteSpace = false; // important! 

आप अंतर देखने के लिए अपने $ नोड-> नोड टाइप का पता लगा सकते हैं। मुझे 3, 1, 3 मिलते हैं, भले ही केवल एक नोड (बच्चा) था। सफेद जगह बंद करें और अब मुझे बस 1.

जीएल प्राप्त करें।

+1

धन्यवाद! मुझे बहुत मदद की। –

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