2010-07-22 10 views
5

हर कोई जानता है कि हमें हमेशा HTML से सामग्री निकालने के लिए regexes के बजाय DOM तकनीकों का उपयोग करना चाहिए, लेकिन मुझे यह महसूस हो रहा है कि मैं कभी भी SimpleXML एक्सटेंशन या इसी तरह के किसी पर भरोसा नहीं कर सकता।बुलेटप्रूफिंग SimpleXMLElement

मैं एक OpenID कार्यान्वयन कोडिंग कर रहा हूँ अभी, और मैं एचटीएमएल खोज करने के लिए SimpleXML उपयोग करने की कोशिश - लेकिन (alixaxel.myopenid.com के साथ) अपना सबसे पहला परीक्षण त्रुटियों की एक बहुत कुछ सामने आए:

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 27: parser error : Opening and ending tag mismatch: link line 11 and head in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: </head> in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]:^in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 64: parser error : Entity 'copy' not defined in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: &copy; 2008 <a href="http://janrain.com/">JanRain, Inc.</a> in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]:^in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 66: parser error : Entity 'trade' not defined in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: myOpenID&trade; and the myOpenID&trade; website are in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]:^in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 66: parser error : Entity 'trade' not defined in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: myOpenID&trade; and the myOpenID&trade; website are in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]:^in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 77: parser error : Opening and ending tag mismatch: link line 8 and html in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: </html> in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]:^in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 78: parser error : Premature end of data in tag head line 3 in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]:^in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 78: parser error : Premature end of data in tag html line 2 in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]: in E:\xampplite\htdocs\index.php on line 6 

Warning: simplexml_load_string() [function.simplexml-load-string]:^in E:\xampplite\htdocs\index.php on line 6 

मुझे याद है कि SimpleXML हमेशा फ़ाइल को पार्स करने का एक तरीका था, स्वतंत्र रूप से यदि दस्तावेज़ में त्रुटियां हैं या नहीं - मुझे विशिष्ट कार्यान्वयन याद नहीं है, लेकिन मुझे लगता है कि यह DOMDocument का उपयोग करके शामिल है। यह सुनिश्चित करने का सबसे अच्छा तरीका क्या है कि SimpleXML हमेशा किसी भी दिए गए दस्तावेज़ को पार करता है?

और कृपया टिडी का उपयोग करने का सुझाव न दें, मुझे लगता है कि एक्सटेंशन धीमा है और यह कई प्रणालियों पर उपलब्ध नहीं है।

उत्तर

10

आप HTML को DOM's loadHTML के साथ लोड कर सकते हैं और फिर SimpleXML पर परिणाम आयात कर सकते हैं।

आईआईआरसी, यह अभी भी पर कुछ सामान पर चकित होगा लेकिन यह टूटी हुई वेबसाइटों की वास्तविक दुनिया में मौजूद कुछ भी बहुत कुछ स्वीकार करेगा।

$html = '<html><head><body><div>stuff & stuff</body></html>'; 

// disable PHP errors 
$old = libxml_use_internal_errors(true); 

$dom = new DOMDocument; 
$dom->loadHTML($html); 

// restore the old behaviour 
libxml_use_internal_errors($old); 

$sxe = simplexml_import_dom($dom); 
die($sxe->asXML()); 
+0

उफ! यह बेहतर है ... क्या यह समाधान * बुलेटप्रूफ * है? क्या मैं किसी दस्तावेज़ को पार्स करने के लिए भरोसा कर सकता हूं? –

+0

@ एलिक्स अच्छी तरह से * किसी * दस्तावेज़ नहीं है। अगर एचटीएमएल बहुत टूटा हुआ है, तो यह बहुत टूटा हुआ है। लेकिन सबसे टूटी हुई एचटीएमएल के लिए यह काम करना चाहिए। XmlReader का उपयोग करने का एक विकल्प होगा। यह एक पुल पार्सर है जो आपको परिभाषित करता है कि किस तत्व पर क्या करना है। अंतर्निहित libxml एक्सटेंशन के लिए कई कॉन्फ़िगरेशन विकल्प भी हैं जिनका उपयोग आप पार्सिंग को प्रभावित करने के लिए कर सकते हैं। – Gordon

0

आप हमेशा एक SAX पार्सर आज़मा सकते हैं ... त्रुटियों के लिए थोड़ा और मजबूत।

बड़े एक्सएमएल पर कुशल नहीं हो सकता है।

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

  • कोई संबंधित समस्या नहीं^_^