दिलचस्प पोस्ट
प्रतिनिधिमंडल: ईवेंट एमीटर या अंगुल्य 2 में अवलोकन अद्वितीय यादृच्छिक संख्या VBA का उपयोग कर फ़ोकस को पहली टेक्स्टबॉक्स पर सेट करने से jQuery के यूआई संवाद को रोकें किसी दिए गए एक्सटेंशन के लिए आइकन प्राप्त करें जावास्क्रिप्ट के साथ सिंटेक्स हाइलाइटिंग कोड एक मूल 64 स्ट्रिंग को एक छवि में कनवर्ट करना और इसे सहेजना एक UIWebView में मेरे iPhone उद्देश्य- C कोड को जावास्क्रिप्ट त्रुटियों के बारे में सूचित कैसे किया जा सकता है? समाधान फ़ाइलों को "हमेशा" की जांच करने से विजुअल स्टूडियो को कैसे रोकें? ओपनजीएल ES में गोलाकार आरेखण बिना अनावश्यक दशमलव 0 के बिना स्ट्रिंग में फ़्लोटिंग नंबर को कैसे अच्छी तरह से प्रारूपित करें? अजगर पर नकारात्मक संख्या का घनराल जड़ हिस्टोग्राम की साजिश रचने वाले, जिनकी बार ऊँचाई 1 के लिए matplotlib में योग होती है कैसे जावास्क्रिप्ट में खिड़की के आकार परिवर्तन घटना ट्रिगर करने के लिए? जावा पायथन एकीकरण जावा जेनेरिक्स (वाइल्डकार्ड)

PHP में XMLReader का उपयोग कैसे करें?

मेरे पास निम्न XML फ़ाइल है, फाइल को बहुत बड़ा है और मैं सोएक्सएक्सएमएल को फाइल खोलने और पढ़ने में सक्षम नहीं हुआ हूं, इसलिए मैं XMLReader को PHP में सफलता से नहीं प्राप्त कर रहा हूँ

<?xml version="1.0" encoding="ISO-8859-1"?> <products> <last_updated>2009-11-30 13:52:40</last_updated> <product> <element_1>foo</element_1> <element_2>foo</element_2> <element_3>foo</element_3> <element_4>foo</element_4> </product> <product> <element_1>bar</element_1> <element_2>bar</element_2> <element_3>bar</element_3> <element_4>bar</element_4> </product> </products> 

मुझे दुर्भाग्य से PHP के लिए इस पर एक अच्छा ट्यूटोरियल नहीं मिला है और मुझे यह देखना अच्छा लगेगा कि मैं एक डाटाबेस में कैसे स्टोर कर सकता हूं।

वेब के समाधान से एकत्रित समाधान "PHP में XMLReader का उपयोग कैसे करें?"

यह सब काम की इकाई की कितनी बड़ी चीज़ पर निर्भर करता है, लेकिन मुझे लगता है कि आप उत्तराधिकार में प्रत्येक <product/> नोड्स का इलाज करने की कोशिश कर रहे हैं।

इसके लिए, प्रत्येक नोड के लिए XMLReader का उपयोग करने के लिए सबसे आसान तरीका होगा, फिर उन तक पहुंचने के लिए सरलएक्सएमएल का उपयोग करें। इस तरह, आप मेमोरी उपयोग को कम रखते हैं क्योंकि आप एक समय में एक नोड का इलाज कर रहे हैं और आप अभी भी सामान्य एक्साइज एमएलएल के उपयोग में आसानी करते हैं। उदाहरण के लिए:

 $z = new XMLReader; $z->open('data.xml'); $doc = new DOMDocument; // move to the first <product /> node while ($z->read() && $z->name !== 'product'); // now that we're at the right depth, hop to the next <product/> until the end of the tree while ($z->name === 'product') { // either one should work //$node = new SimpleXMLElement($z->readOuterXML()); $node = simplexml_import_dom($doc->importNode($z->expand(), true)); // now you can use $node without going insane about parsing var_dump($node->element_1); // go to next <product /> $z->next('product'); } 

विभिन्न दृष्टिकोणों के पेशेवरों और विपक्षों की त्वरित अवलोकन:

XMLReader केवल

  • पेशेवरों: तेज, थोड़ा स्मृति का उपयोग करता है

  • विपक्ष: लिखना और डीबग करने के लिए ज़्यादा कठिन है, कुछ उपयोगी उपयोग करने के लिए यूज़रलैंड कोड की बहुत सारी आवश्यकता होती है। यूज़रलैंड कोड धीमा है और त्रुटि की संभावना है। इसके अलावा, यह आपको बनाए रखने के लिए कोड की और अधिक पंक्तियां देता है

XMLReader + सरल XML

  • पेशेवरों: बहुत मेमोरी (केवल एक नोड संसाधित करने के लिए आवश्यक स्मृति) का उपयोग नहीं करता है और सरल एक्सएमएल, जैसा कि नाम का मतलब है, उपयोग करने में वास्तव में आसान है।

  • विपक्ष: प्रत्येक नोड के लिए एक सरल एक्सएमलेमेंट ऑब्जेक्ट बनाना बहुत तेज नहीं है। आपको वास्तव में इसे समझने के लिए बेंचमार्क करना होगा कि यह आपके लिए एक समस्या है या नहीं। यहां तक ​​कि एक मामूली मशीन हर हज़ार नोड प्रति सेकंड पर काम कर पाएगी, हालांकि

XMLReader + DOM

  • पेशेवरों: सरलएक्सएमएल और XMLReader के रूप में ज्यादा मेमोरी का उपयोग करता है :: विस्तार () एक नया SimpleXMLElement बनाने से अधिक तेज़ है। मेरी इच्छा है कि simplexml_import_dom() का उपयोग करना संभव था लेकिन उस स्थिति में ऐसा प्रतीत नहीं होता है

  • विपक्ष: डोम के साथ काम करने के लिए परेशान है। यह आधे रास्ते XMLReader और SimpleXML के बीच है जितना जटिल और अजीब नहीं है XMLReader के रूप में, लेकिन हल्के साल SimpleXML के साथ काम करने से दूर।

मेरी सलाह: SimpleXML के साथ एक प्रोटोटाइप लिखें, देखें कि क्या यह आपके लिए काम करता है। यदि प्रदर्शन सर्वोपरि है, तो DOM का प्रयास करें यथासंभव XMLReader से दूर रहें। याद रखें कि जितना अधिक कोड आप लिखते हैं, उतनी अधिक संभावना है कि आप बग्स शुरू करें या प्रदर्शन प्रतिगमन पेश करें।

XML के लिए विशेषताओं के साथ स्वरूपित …

data.xml:

 <building_data> <building address="some address" lat="28.902914" lng="-71.007235" /> <building address="some address" lat="48.892342" lng="-75.0423423" /> <building address="some address" lat="58.929753" lng="-79.1236987" /> </building_data> 

php कोड:

 $reader = new XMLReader(); if (!$reader->open("data.xml")) { die("Failed to open 'data.xml'"); } while($reader->read()) { if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'building') { $address = $reader->getAttribute('address'); $latitude = $reader->getAttribute('lat'); $longitude = $reader->getAttribute('lng'); } $reader->close(); 

एक्सएमएल (अमेज़ॅन मेगावाट्स) के ट्रकलोड से बाहर उपयोगी जानकारी के नंगे को निकालने के लिए मेरे अधिकांश एक्सएमएल पार्सिंग जीवन खर्च किए जा रहे हैं जैसे, मेरा उत्तर मानता है कि आप केवल विशिष्ट जानकारी चाहते हैं और आप जानते हैं कि यह कहां स्थित है।

मुझे पता है कि XMLReader का उपयोग करने का सबसे आसान तरीका यह है कि यह पता है कि कौन से टैग मुझे जानकारी से बाहर रखना चाहते हैं और उनका उपयोग करना है यदि आप एक्सएमएल की संरचना जानते हैं और उसके पास बहुत सारे अनूठे टैग हैं, तो मुझे लगता है कि पहले मामले का उपयोग करना आसान है मामले 2 और 3 सिर्फ आपको दिखाएंगे कि यह अधिक जटिल टैगों के लिए कैसे किया जा सकता है। यह बहुत तेज है; PHP में PHP का सबसे तेज़ एक्सएमएल पार्सर क्या है?

यह याद रखना सबसे महत्वपूर्ण बात है कि टैग-आधारित पार्सिंग करते समय इसका उपयोग करना if ($myXML->nodeType == XMLReader::ELEMENT) {... – यह सुनिश्चित करने के लिए कि हम केवल नोड्स खोलने और सफेद स्थान या बंद नोड्स या जो भी हो

 function parseMyXML ($xml) { //pass in an XML string $myXML = new XMLReader(); $myXML->xml($xml); while ($myXML->read()) { //start reading. if ($myXML->nodeType == XMLReader::ELEMENT) { //only opening tags. $tag = $myXML->name; //make $tag contain the name of the tag switch ($tag) { case 'Tag1': //this tag contains no child elements, only the content we need. And it's unique. $variable = $myXML->readInnerXML(); //now variable contains the contents of tag1 break; case 'Tag2': //this tag contains child elements, of which we only want one. while($myXML->read()) { //so we tell it to keep reading if ($myXML->nodeType == XMLReader::ELEMENT && $myXML->name === 'Amount') { // and when it finds the amount tag... $variable2 = $myXML->readInnerXML(); //...put it in $variable2. break; } } break; case 'Tag3': //tag3 also has children, which are not unique, but we need two of the children this time. while($myXML->read()) { if ($myXML->nodeType == XMLReader::ELEMENT && $myXML->name === 'Amount') { $variable3 = $myXML->readInnerXML(); break; } else if ($myXML->nodeType == XMLReader::ELEMENT && $myXML->name === 'Currency') { $variable4 = $myXML->readInnerXML(); break; } } break; } } } $myXML->close(); } 

XMLReader अच्छी तरह से PHP साइट पर प्रलेखित है। यह एक XML पुल पार्सर है, जिसका अर्थ है कि यह दिए गए XML दस्तावेज़ के नोड्स (या डोम नोड्स) के माध्यम से पुनरावृति करने के लिए उपयोग किया जाता है। उदाहरण के लिए, आप इस तरह दिए गए पूरे दस्तावेज़ के माध्यम से जा सकते हैं:

 <?php $reader = new XMLReader(); if (!$reader->open("data.xml")) { die("Failed to open 'data.xml'"); } while($reader->read()) { $node = $reader->expand(); // process $node... } $reader->close(); ?> 

इसके बाद आप तय कर सकते हैं कि XMLReader :: विस्तार () द्वारा दिए गए नोड के साथ कैसे निपटें।

 Simple example: public function productsAction() { $saveFileName = 'ceneo.xml'; $filename = $this->path . $saveFileName; if(file_exists($filename)) { $reader = new XMLReader(); $reader->open($filename); $countElements = 0; while($reader->read()) { if($reader->nodeType == XMLReader::ELEMENT) { $nodeName = $reader->name; } if($reader->nodeType == XMLReader::TEXT && !empty($nodeName)) { switch ($nodeName) { case 'id': var_dump($reader->value); break; } } if($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == 'offer') { $countElements++; } } $reader->close(); exit(print('<pre>') . var_dump($countElements)); } } 

स्वीकार किए गए उत्तर ने मुझे एक अच्छी शुरुआत दी, लेकिन मुझे और अधिक वर्गों और अधिक प्रसंस्करण में लाया गया, जितना मैंने पसंद किया; तो यह मेरी व्याख्या है:

 $xml_reader = new XMLReader; $xml_reader->open($feed_url); // move the pointer to the first product while ($xml_reader->read() && $xml_reader->name != 'product'); // loop through the products while ($xml_reader->name == 'product') { // load the current xml element into simplexml and we're off and running! $xml = simplexml_load_string($xml_reader->readOuterXML()); // now you can use your simpleXML object ($xml). echo $xml->element_1; // move the pointer to the next product $xml_reader->next('product'); } // don't forget to close the file $xml_reader->close(); 

यह विषय बहुत पहले छोड़ दिया गया है, लेकिन मैं इसे बस मिल गया। धन्यवाद भगवान।

मेरी समस्या है कि मुझे ONIX फ़ाइल (पुस्तक डेटा) पढ़नी है, और इसे हमारे डेटाबेस में संग्रहीत करना है मैं पहले simplexml_load का उपयोग करता हूं, और हालांकि यह बहुत सी मेमोरी का उपयोग करता है लेकिन अपेक्षाकृत छोटी फ़ाइल (300 एमबी तक) के लिए अभी भी ठीक है। उस आकार से परे मेरे लिए एक आपदा है

पढ़ने के बाद, विशेष रूप से फ्रांसिस लुईस व्याख्या, मैं xmlreader और simplexml के संयोजन का उपयोग करता हूँ नतीजा असाधारण है, मेमोरी उपयोग छोटा है और इसे मेरे लिए काफी तेजी से डाटाबेस में डालें।

यहां मेरा कोड है:

 <?php $dbhost = "localhost"; // mysql host $dbuser = ""; //mysql username $dbpw = ""; // mysql user password $db = ""; // mysql database name //i need to truncate the old data first $conn2 = mysql_connect($dbhost, $dbuser, $dbpw); mysql_select_db($db); mysql_query ("truncate ebiblio",$conn2); //$xmlFile = $_POST['xmlFile']; //$xml=simplexml_load_file("ebiblio.xml") or die("Error: Cannot create object"); $reader = new XMLReader(); //load the selected XML file to the DOM if (!$reader->open("ebiblio.xml")) { die("Failed to open 'ebiblio.xml'"); } while ($reader->read()): if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'product'){ $xml = simplexml_load_string($reader->readOuterXML()); $productcode = (string)$xml->a001; $title = (string)$xml->title->b203; $author = (string)$xml->contributor->b037; $language = (string)$xml->language->b252; $category = $xml->subject->b069; $description = (string)$xml->othertext->d104; $publisher = (string)$xml->publisher->b081; $pricecover = (string)$xml->supplydetail->price->j151; $salesright = (string)$xml->salesrights->b090; @$productcode1 = htmlentities($productcode,ENT_QUOTES,'latin1_swedish_ci'); @$title1 = htmlentities($title,ENT_QUOTES,'latin1_swedish_ci'); @$author1 = htmlentities($author,ENT_QUOTES,'latin1_swedish_ci'); @$language1 = htmlentities($language,ENT_QUOTES,'latin1_swedish_ci'); @$category1 = htmlentities($category,ENT_QUOTES,'latin1_swedish_ci'); @$description1 = htmlentities($description,ENT_QUOTES,'latin1_swedish_ci'); @$publisher1 = htmlentities($publisher,ENT_QUOTES,'latin1_swedish_ci'); @$pricecover1 = htmlentities($pricecover,ENT_QUOTES,'latin1_swedish_ci'); @$salesright1 = htmlentities($salesright,ENT_QUOTES,'latin1_swedish_ci'); $conn = mysql_connect($dbhost, $dbuser, $dbpw); mysql_select_db($db); $sql = "INSERT INTO ebiblio VALUES ('" . $productcode1 . "','" . $title1 . "','" . $author1 . "','" . $language1 . "','" . $category1 . "','" . $description1 . "','" . $publisher1 . "','" . $pricecover1 . "','" . $salesright1 . "')"; mysql_query($sql, $conn); $reader->next('product'); } endwhile; ?> 

मैं affraid है कि XmlReader :: विस्तार () का उपयोग करके बहुत अधिक RAM का उपभोग हो सकता है जब सबट्री इतनी छोटी नहीं होती है मुझे यकीन नहीं है कि यह XmlReader का एक अच्छा विकल्प है हालांकि मैं मानता हूं कि XmlReader वास्तव में कमजोर है और जटिल नेस्टेड एक्सएमएल पेड़ की प्रक्रिया के लिए उपयुक्त नहीं है। मुझे वास्तव में दो चीजों को पसंद नहीं है: सबसे पहले, वर्तमान नोड में एक्सएमएल पेड़ में इसका मार्ग संपत्ति के रूप में सुलभ नहीं है, दूसरा, जो नोड्स को पढ़ते समय XPath जैसी प्रक्रिया को नहीं चला सकता। बेशक असली XPath क्वेरी में बड़ी एक्सएमएल के लिए बहुत समय लगता है, लेकिन इसके बजाय "पथ हुक" का उपयोग किया जा सकता है – जैसे कि जब वर्तमान तत्व पथ मेल खाता (रूट) उप-प्रथा PHP फ़ंक्शन / विधि आग करता है इस प्रकार मैंने कुछ साल पहले XmlReader के शीर्ष पर अपनी कक्षा विकसित की थी। वे सही नहीं हैं और शायद मैं आज बेहतर लिखूंगा लेकिन फिर भी किसी के लिए भी उपयोगी हो सकता है:

https://bitbucket.org/sdvpartnership/questpc-framework/src/c481a8b051dbba0a6644ab8a77a71e58119e7441/includes/Xml/Reader/?at=master

मैं एक्सएमएल पथ 'नोड 1 / नोड 2' का निर्माण करता हूं तो फिर पीसीआरए मैचों के साथ हुक का उपयोग करें जो XPath से कम शक्तिशाली होते हैं, हालांकि मेरी जरूरतों के लिए पर्याप्त थे मैंने इन वर्गों के साथ काफी जटिल बड़े XML संसाधित किया