दिलचस्प पोस्ट
सूची चौराहे को कैसे ढूंढें? कैसे गिट मर्ज विवाद को हल करने के लिए? बिग-ओ आठ साल के बच्चों के लिए? jQuery अजाक्स त्रुटि हैंडलिंग, कस्टम अपवाद संदेश दिखाएं बैकस्लैश दो बार क्यों दिखाई देते हैं? : के बाद और: सीएसएस छद्म तत्वों से पहले आईई 7 के लिए हैक स्थान पर बिटमैप सहेजें एक अन्य थ्रेड से यूनिटी एपीआई का उपयोग करें या मुख्य थ्रेड में फ़ंक्शन कॉल करें मैं RelativeSource के साथ WPF बाइंडिंग का उपयोग कैसे करूं? सीमा से बाहर सरणी तक पहुंचने के लिए कितना खतरनाक है? एंड्रॉइड एल्पीसाइज़ मल्टीलाइन टेक्स्टव्यू Xcode 5 में उपलब्ध नए प्रलेखन कमांड क्या हैं? NSFileManager (जेलब्रेक) के लिए IOS पर रूट अनुमतियां प्राप्त करना ServiceLocator एक विरोधी पैटर्न है? सी ++ का प्रतिबिंब क्यों नहीं है?

PHP के लिए सर्वश्रेष्ठ XML पार्सर

मैंने पहले एक्सएमएल पार्सर का इस्तेमाल किया है, और यद्यपि यह ठीक काम करता है, मैं इसके साथ सामान्य रूप से खुश नहीं था, ऐसा लगा जैसे मैं उन चीजों के लिए काम कर रहा था जो मूलभूत कार्यक्षमता होनी चाहिए।

मैंने हाल ही में सोशल एक्सएमएल देखा है लेकिन मैंने इसे अभी तक नहीं किया है क्या यह कोई आसान है? दोनों क्या फायदे और नुकसान कर रहे हैं? आपके द्वारा उपयोग किए गए कोई अन्य पार्सर?

वेब के समाधान से एकत्रित समाधान "PHP के लिए सर्वश्रेष्ठ XML पार्सर"

मुझे कहना होगा कि SimpleXML केक लेता है क्योंकि यह पहली बार एक एक्सटेंशन है, जो सी में लिखा गया है, और बहुत तेज है। लेकिन दूसरा, पार्स किए गए दस्तावेज़ को PHP ऑब्जेक्ट का रूप लेता है। तो आप $root->myElement जैसे "क्वेरी" कर सकते हैं

PHP के उपलब्ध XML एक्सटेंशन पर एक नज़र डालें और उन लोगों की चर्चा के लिए http://devzone.zend.com/243/ और http://devzone.zend.com/1035/ देखें।

एक्सएमएल पार्सर और सरल एक्सएमएल के बीच मुख्य अंतर यह है कि उत्तरार्द्ध एक पुल पार्सर नहीं है। सरल एक्सएमएल डीओएम एक्सटेंशन के ऊपर बनाया गया है और पूरी XML फ़ाइल को स्मृति में लोड करेगा। एक्सएमएल पार्सर जैसे XMLReader केवल वर्तमान नोड को स्मृति में लोड करेगा आप विशिष्ट नोड्स के लिए हैंडलर परिभाषित करते हैं जो पार्सर के साथ मुठभेड़ होने पर ट्रिगर हो जाएगा। यह तेज है और स्मृति पर बचाता है आप XPath का उपयोग करने में सक्षम नहीं होने के लिए उस के लिए भुगतान करते हैं।

निजी तौर पर, मुझे सोमैटएक्सएम काफी डोम से अधिक प्रदान करता है (इसलिए सरल) को सीमित करता है आप आसानी से DOM और SimpleXml के बीच स्विच कर सकते हैं, लेकिन मैं आम तौर पर परेशान नहीं होता और सीधे DOM मार्ग को जाता हूं। DOM W3C DOM API का कार्यान्वयन है, इसलिए आप इसके साथ अन्य भाषाओं से परिचित हो सकते हैं, उदाहरण के लिए जावास्क्रिप्ट

जब एक एक्सटेंशन उपलब्ध नहीं होता है तो यह त्वरित और आसान XML पार्सिंग के लिए एक उपयोगी कार्य है:

 <?php /** * Convert XML to an Array * * @param string $XML * @return array */ function XMLtoArray($XML) { $xml_parser = xml_parser_create(); xml_parse_into_struct($xml_parser, $XML, $vals); xml_parser_free($xml_parser); // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie $_tmp=''; foreach ($vals as $xml_elem) { $x_tag=$xml_elem['tag']; $x_level=$xml_elem['level']; $x_type=$xml_elem['type']; if ($x_level!=1 && $x_type == 'close') { if (isset($multi_key[$x_tag][$x_level])) $multi_key[$x_tag][$x_level]=1; else $multi_key[$x_tag][$x_level]=0; } if ($x_level!=1 && $x_type == 'complete') { if ($_tmp==$x_tag) $multi_key[$x_tag][$x_level]=1; $_tmp=$x_tag; } } // jedziemy po tablicy foreach ($vals as $xml_elem) { $x_tag=$xml_elem['tag']; $x_level=$xml_elem['level']; $x_type=$xml_elem['type']; if ($x_type == 'open') $level[$x_level] = $x_tag; $start_level = 1; $php_stmt = '$xml_array'; if ($x_type=='close' && $x_level!=1) $multi_key[$x_tag][$x_level]++; while ($start_level < $x_level) { $php_stmt .= '[$level['.$start_level.']]'; if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level]) $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']'; $start_level++; } $add=''; if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete')) { if (!isset($multi_key2[$x_tag][$x_level])) $multi_key2[$x_tag][$x_level]=0; else $multi_key2[$x_tag][$x_level]++; $add='['.$multi_key2[$x_tag][$x_level].']'; } if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem)) { if ($x_type == 'open') $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];'; else $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];'; eval($php_stmt_main); } if (array_key_exists('attributes', $xml_elem)) { if (isset($xml_elem['value'])) { $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];'; eval($php_stmt_main); } foreach ($xml_elem['attributes'] as $key=>$value) { $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;'; eval($php_stmt_att); } } } return $xml_array; } ?> 

नमस्ते मुझे लगता है कि SimpleXml बहुत उपयोगी है। और इसके साथ मैं xpath का उपयोग कर रहा हूं;

 $xml = simplexml_load_file("som_xml.xml"); $blocks = $xml->xpath('//block'); //gets all <block/> tags $blocks2 = $xml->xpath('//layout/block'); //gets all <block/> which parent are <layout/> tags 

मैं कई XML विन्यास का उपयोग करता हूं और इससे मुझे वास्तव में तेजी से पार्स करने में मदद मिलती है I SimpleXml C पर लिखा C इसलिए यह बहुत तेज है

यह इस बात पर निर्भर करता है कि आप XML फ़ाइलों के साथ क्या करने का प्रयास कर रहे हैं यदि आप बस एक्सएमएल फाइल (जैसे कि कॉन्फ़िगरेशन फ़ाइल) को पढ़ने की कोशिश कर रहे हैं, तो द बेस्ट फ्लीए को सरल एक्सएमएल के सुझाव देने में सही है क्योंकि यह बनाता है कि नेस्टेड अर्रेऑब्जेक्ट जैसे मान $ xml-> root-> बच्चे द्वारा सुलभ हो जाएगा

यदि आप एक्सएमएल फ़ाइलों को हेरफेर करने की कोशिश कर रहे हैं, तो आप संभवतः डॉओएम एक्सएमएल का इस्तेमाल कर रहे हैं

सीआरएक्सएमएल पार्सर पार्सर के लिए एक असली आसान है।

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

आप इस वर्ग को यहां पर डाउनलोड कर सकते हैं

http://freshmeat.net/projects/crxml

या phpclasses.org से

http://www.phpclasses.org/package/6769-PHP-Manipulate-XML-documents-as-array.html