2010-12-27 17 views
7

देखें नीचे एटी संपादन और अधिक सटीक त्रुटि आउटपुट दिखाएं करनेपीएचपी - SimpleXML पार्स त्रुटि

मैं पहली बार SimpleXML प्रयोग करने के लिए PHP के साथ कुछ हद तक बड़े (~ 15MB) एक्सएमएल फाइल को पार्स कर रहा हूँ। फ़ाइलों उड़ान खोज परिणाम हैं ताकि वे लंबे विशेषताएं (लिंक वापस कश्ती करने के लिए है, उदाहरण के:
"/book/flightcode=1238917408.NxJI6G.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052 & sid = 26-Vu01v7ilzhSAjPVLZ3Ul में "और फिर,

", उम्मीद '' 38917408.NxJI6G.0.F.ORBITZAIR: निकाय: लाइन 10:: "

SimpleXML जब पार्स करने इस त्रुटि फेंकता" पार्सर त्रुटि: EntityRef , ORBITZAIR.0.f36f1ea92513977249aa695112410052 & एसआईडी " और फिर;

"simplexml_load_string() [function.simplexml लोड स्ट्रिंग]:^में,"

और इसके आगे प्रत्येक पंक्ति जहां इन यूआरएल देखते हैं के लिए।

मुझे SimpleXML का कोई उल्लेख नहीं मिला है, जिसमें कोई समाधान नहीं है php.net पर लंबे विशेषताओं को पसंद नहीं है। मैं बस अभी के लिए SimpleXML का उपयोग और सीखना चाहूंगा और यदि कोई गैर-जंकी, कुछ आसान कामकाज है तो इस त्रुटि से पहले काम करें।

क्या किसी के पास कोई समाधान है? अग्रिम में धन्यवाद!

मैंने एक्सएमएल की पहली 13 लाइनों में प्रवेश करने की कोशिश की लेकिन यह केवल एक्सएमएल के बिना जानकारी आउटपुट करता है .... अगर मैं मदद करूंगा तो मैं ऐसा कर सकता हूं। मुझे यकीन नहीं है कि एक और पार्सर/एक्सटेंशन का उपयोग करने से कार्यक्षमता या उपयोग में आसानी कम हो जाएगी, लेकिन अगर वर्कअराउंड नहीं है तो कृपया दूसरे को सुझाव दें (डीओएम या एक्सएमएल रीडर जो मैं सोच रहा हूं)।

संपादन नीचे कम मिलावटी त्रुटि आउटपुट शामिल करने के लिए:

http://dl.dropbox.com/u/10206237/stack_overflow_xml.xml

त्रुटि 1:

simplexml_load_string() [<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: Entity: line 10: parser error : EntityRef: expecting ';' in 

त्रुटि 2: (एक्सएमएल मुझे लगता है कि ठीक है, क्योंकि यह का उपयोग कर एक अजगर स्क्रिप्ट के साथ काम करता है डोम; मैं इसे PHP में अनुवाद कर रहा हूं क्योंकि मुझे पायथन नहीं पता है)। मुझे नहीं पता था कि ब्राउज़र में आउटपुट अलग होगा। । रोगी होने के लिए धन्यवाद)

<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: 38917408.Pt8rW8.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052&amp;_sid_ in 

त्रुटि 3:

function.simplexml-load-string</a>]:                    ^in  

(उन स्थानों में से सब वहाँ में हैं) के रूप में क्यों यह उनकी टिप्पणी में हो रहा है

+7

लोड पूरी फ़ाइल (बनाम डोम पार्सर SAX पार्सर) के बजाय स्ट्रीम करने के लिए अन्य पुस्तकालयों उपयोग कर रहा है, विशेषता में ' 'और'' । यह एक उचित एक्सएमएल इकाई नहीं है। सभी शाब्दिक ampersands को '&' के रूप में एन्कोड किया जाना चाहिए (विडंबनात्मक रूप से) - त्रुटि बताती है कि यह ';' क्योंकि यह एक इकाई होने के लिए ''और sid'' चाहता है यानी: '' &sid;' '। –

+1

समाधान यह पूछना है कि जो भी XML उस कोड को ठीक करने और कुछ मान्य XML plzkthx आउटपुट करने के लिए उत्पन्न करता है। –

+0

वास्तविक फ़ाइल में यह कहता है: "& _sid_ = 15- त्रुटि मेरे ब्राउज़र द्वारा आउटपुट थी। मुझे एन्कोडिंग के बारे में कुछ भी नहीं पता है। – JohnAllen

उत्तर

12

अन्य उत्तर और टिप्पणियों में mentionned के रूप में, अपने स्रोत एक्सएमएल टूट है और एक्सएमएल पारसर्स अमान्य इनपुट अस्वीकार करने वाले हैं। libxml में एक "पुनर्प्राप्ति" मोड है जो आपको इस टूटे एक्सएमएल को लोड करने देगा, लेकिन आप "& sid" भाग खो देंगे ताकि इससे मदद न हो।

यदि आप भाग्यशाली हैं और आपको संभावनाएं पसंद हैं, तो आप इनपुट को ठीक करने के तरीके से इसे किसी भी तरह से काम करने का प्रयास कर सकते हैं। आप कुछ स्ट्रिंग प्रतिस्थापन का उपयोग उन एम्पर्सेंड से बचने के लिए कर सकते हैं जो दिखते हैं कि वे किसी URL के क्वेरी भाग में हैं।

$xml = file_get_contents('broken.xml'); 
// replace '&' followed by a bunch of letters, numbers 
// and underscores and an equal sign with &amp; 
$xml = preg_replace('#&(?=[a-z_0-9]+=)#', '&amp;', $xml); 
$sxe = simplexml_load_string($xml); 

यह जाहिर है, कुछ नहीं बल्कि एक हैक और केवल अच्छी तरह से अपनी स्थिति ठीक करने के लिए अपने XML प्रदाता पूछने के लिए उनके जनरेटर ठीक करने के लिए है। क्योंकि अगर यह टूटी हुई एक्सएमएल उत्पन्न करता है, तो कौन जानता है कि अन्य त्रुटियों पर ध्यान न दिया गया है?

+0

पार्स किए गए XML इनपुट को अमान्य घोषित करने के लिए कैसे जांचें? SimpleXmlElement() फ़ंक्शन अमान्य XML के मामले में झूठी नहीं लौटाता है? क्या मैं टी? – scaryguy

+0

यदि एक्सएमएल अमान्य है तो आप वास्तव में खराब हो गए हैं। आप स्ट्रिंग मैनिपुलेशन (एक्सएमएल मैनिपुलेशन के विपरीत) का उपयोग करके डेटा को बचाने का प्रयास कर सकते हैं लेकिन स्थिति को ठीक करने का एकमात्र निश्चित तरीका वैध एक्सएमएल का उत्पादन करना है। –

3

डैरिल सही जवाब है ऊपर। इसे ठीक करने का एक तरीका '&' के साथ '' एम्पर्सेंड को प्रतिस्थापित करने के लिए str_replace() को एक str_replace() करना होगा। एक्सएमएल मेंPHP manual के अनुसार आप भी अपने संस्थाओं के साथ ऐम्परसेंड को बदलने के लिए इस नियमित अभिव्यक्ति इस्तेमाल कर सकते हैं:

$s = preg_replace('/&[^; ]{0,6}.?/e', "((substr('\\0',-1) == ';') ? '\\0' : '&amp;'.substr('\\0',1))", 
0

शायद पार्सर के लिए पार्स की गई एक्सएमएल फ़ाइल बहुत बड़ी हो सकती है। लेकिन आप LIBXML_PARSEHUGE को एक विकल्प के रूप में पास करने का प्रयास कर सकते हैं - जिसने मेरे मामले में मदद की।

0

मैं 13MB फाइलों के साथ इस समस्या थी और LIBXML_PARSEHUGE पैरामीटर शामिल करके इसे हल:

$xml = new SimpleXMLElement($contents, LIBXML_PARSEHUGE); 

नोट: 1GB पर ini_set का उपयोग कर फ्लॉप मेरी समस्या का समाधान क्योंकि पार्स सामग्री इससे अधिक पर कब्जा कर लिया।

एक और अधिक कट्टरपंथी दृष्टिकोण यह है "लंबे" विशेषता, यह नहीं की तरह XML Streamer

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