2010-05-26 18 views
18

पर लूप, मैं इस प्रश्न से सुझाव का पालन कर रहा हूं, Mature HTML Parser for PHP, HTML को पार्स करने के बारे में जो DOMDocument के साथ विकृत हो सकता है।DOMDocument

क्या पार्स किए गए दस्तावेज़ पर लूप करने का कोई आसान तरीका है? तो मैं इस तरह एचटीएमएल पर लूप करना चाहता हूँ।

$html='<ul> 
     <li>value1</li> 
     <li>value1</li> 
     <li>value3 
      <p>subvalue</p> 
     </li> 
     </ul> 
     <p>hello world</p>'; 

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
??? 
foreach (??? as $node) 
{ 
    print $node->nodeName.':'.$node->nodeValue; 
} 

और कुछ हद तक परिणाम प्राप्त करें।

ul: 
li:value1 
li:value2 
li:value3 
p:subvalue 
p:hello world 

$doc->childNodes का उपयोग करके मैं वास्तव में ऐसा नहीं करता जो मैं चाहता हूं। चूंकि यह पेड़ में कम शाखाओं में जाने के लिए प्रतीत नहीं होता है। मैंने halfdan द्वारा सुझाए गए कोड का उपयोग किया और मुझे इस तरह के परिणाम मिलते हैं।

html: 
html:value1 
     value1 
     value3 
      subvalue 

     hello world 
+0

डोम ऑब्जेक्ट्स (लेकिन हमेशा नहीं) एक संपत्ति है जिसे $ childNodes कहा जाता है जिसे आप फिर से चालू कर सकते हैं। आप hasChildNodes() विधि के साथ इस प्रॉपर्टी की उपस्थिति या अन्यथा जांच सकते हैं। – GordonM

उत्तर

25

इस प्रयास करें:

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
showDOMNode($doc); 

function showDOMNode(DOMNode $domNode) { 
    foreach ($domNode->childNodes as $node) 
    { 
     print $node->nodeName.':'.$node->nodeValue; 
     if($node->hasChildNodes()) { 
      showDOMNode($node); 
     } 
    }  
} 
+0

धन्यवाद, मैंने अपना प्रश्न अधिक स्पष्ट होने के लिए अपडेट किया है। मुझे विश्वास नहीं है कि '$ doc-> childNodes' स्वयं ही जो चाहता है वह करता है। असल में मैं पेड़ में प्रत्येक नोड का दौरा करना चाहता हूं, न केवल सभी स्तरों को एक स्तर पर देखता हूं। – Zoredache

+0

ठीक है, एक सेकेंड दें और मैं अपनी पोस्ट अपडेट करूंगा। – halfdan

1

मैं तत्वों के साथ मुद्दों है कि ग डेटा, था हो रही थी जहां भी तत्व है कि जहां लौटने कि उन्होंने किया बच्चों नहीं था।

मुझे यकीन नहीं है कि यह क्यों था।

आसपास काम मैंने पाया

if($node->childNodes->length != 1) { 
     showDOMNode($node); 
    } 

को

if($node->hasChildNodes()) { 
     showDOMNode($node); 
    } 

बदलने के लिए था और कोड अब पूरी तरह से काम करता है।

2

आप PHP Simple HTML DOM Parser उपयोग करने की आवश्यकता है और निम्नलिखित कोड:

<?php 
require_once 'simplehtmldom/simple_html_dom.php'; 

function iterateHtmlElements($html) 
{ 
    $dom = str_get_html($html); 
    $dom->set_callback('handleElement'); 
    $dom->__toString(); 
    echo "\n"; 
} 

function handleElement(simple_html_dom_node $elem) 
{ 
    if($elem->tag == 'text') { 
     echo $elem->innertext(); 
    } 
    else { 
     echo "\n" . $elem->tag . ": "; 
    } 
} 

$html='<ul> 
     <li>value1</li> 
     <li>value1</li> 
     <li>value3 
      <p>subvalue</p> 
     </li> 
     </ul> 
     <p>hello world</p>'; 
iterateHtmlElements($html); 

यह बिल्कुल काम करता है के रूप में उम्मीद। मैं इनपुट आपके द्वारा दी गई यह जाँच की और निम्न परिणाम है:

> php test2.php 

ul: 
li: value1 
li: value1 
li: value3 
p: subvalue 
p: hello world 
0

एक तरह से पालन पेड़ चलने के लिए है:

function next_node($node) 
{ 
    if($node->firstChild != null) 
    { 
     return $node->firstChild; 
    } 

    if($node->nextSibling != null) 
    { 
     return $node->nextSibling; 
    } 

    for($node = $node->parentNode; $node != null; $node = $node->parentNode) 
    { 
     if($node->nextSibling != null) 
     { 
      return $node->nextSibling; 
     } 
    } 

    return null; 
} 

for($node = $doc; $node != null; $node = next_node($node)) 
{ 
    // handle node (read-only mode, if you need read-write 
    // you have to save all the nodes in an array and then 
    // use that array 
    // 
    ... 
} 

यह सबसे दस्तावेज़ों के लिए काम करता है, लेकिन यह समय पर की तरह दिखता है parentNode किसी भी तरह से सही ढंग से सेट नहीं है और next_node() फ़ंक्शन गलत जानकारी लौटने पर समाप्त होता है।

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