2013-10-24 7 views
5

मैं एक एक्सएमएल वस्तु लूप करने के लिए PHP में साधारण उपयोग करने के लिए कोशिश कर रहा हूँ के साथ एक एक्सएमएल वस्तु के माध्यम से लूप - वस्तु प्रारूप नीचे है: -SimpleXML

मैं निम्नलिखित त्रुटि मिलती है जब मैं द्वारा तत्व टैग प्राप्त करने की कोशिश नाम - क्या कोई यह समझा सकता है कि मैं क्या गलत कर रहा हूं?

<?xml version="1.0" encoding="utf-8"?> 
<response> 
    <products> 
     <item> 
      <product_id>32417</product_id> 
      <manufacturer>Alcatel</manufacturer> 
      <model>Sparq 2</model> 
      <deeplink>http://www.mysite.com/sc_offer?gid=32417</deeplink> 
      <thumbnail_URL>http://www.mysite.com/images/devices/thumbs/Alcatel-Sparq-II.jpg</thumbnail_URL> 
      <image_URL>http://www.mysite.com/images/devices/Alcatel-Sparq-II.jpg</image_URL> 
      <price_not_working>0.00</price_not_working> 
      <price_poor>0.00</price_poor> 
      <price_fair>20.00</price_fair> 
      <price_good>25.00</price_good> 
      <price_perfect>25.00</price_perfect> 
      <price_new>25.00</price_new> 
      <battery_new>1.00</battery_new> 
      <battery_perfect>1.00</battery_perfect> 
      <battery_good>1.00</battery_good> 
      <battery_fair>1.00</battery_fair> 
      <battery_poor>0.00</battery_poor> 
      <charger_new>1.00</charger_new> 
      <charger_perfect>1.00</charger_perfect> 
      <charger_good>1.00</charger_good> 
      <charger_fair>1.00</charger_fair> 
      <charger_poor>0.00</charger_poor> 
      <packaging_new>1.00</packaging_new> 
      <packaging_perfect>1.00</packaging_perfect> 
      <packaging_good>1.00</packaging_good> 
      <packaging_fair>1.00</packaging_fair> 
      <packaging_poor>0.00</packaging_poor> 
     </item> 
     <item> 
      <product_id>31303</product_id> 
      <manufacturer>Apple</manufacturer> 
      <model>iPhone 3G 8gb</model> 
      <deeplink>http://www.mysite.com/sc_offer?gid=31303</deeplink> 
      <thumbnail_URL>http://www.mysite.com/images/devices/thumbs/iPhone 8 3G.jpg</thumbnail_URL> 
      <image_URL>http://www.mysite.com/images/devices/iPhone 8 3G.jpg</image_URL> 
      <price_not_working>0.00</price_not_working> 
      <price_poor>0.00</price_poor> 
      <price_fair>7.00</price_fair> 
      <price_good>2.00</price_good> 
      <price_perfect>2.00</price_perfect> 
      <price_new>2.00</price_new> 
      <battery_new>1.00</battery_new> 
      <battery_perfect>1.00</battery_perfect> 
      <battery_good>1.00</battery_good> 
      <battery_fair>1.00</battery_fair> 
      <battery_poor>0.00</battery_poor> 
      <charger_new>1.00</charger_new> 
      <charger_perfect>1.00</charger_perfect> 
      <charger_good>1.00</charger_good> 
      <charger_fair>1.00</charger_fair> 
      <charger_poor>0.00</charger_poor> 
      <packaging_new>1.00</packaging_new> 
      <packaging_perfect>1.00</packaging_perfect> 
      <packaging_good>1.00</packaging_good> 
      <packaging_fair>1.00</packaging_fair> 
      <packaging_poor>0.00</packaging_poor> 
     </item> 
    </products> 
</response> 

मेरे PHP कोड के नीचे है::

$devices = $xml->getElementsByTagName("response"); // error on this line 

मैं उपकरणों एक सरणी तो मैं उपयोग कर सकते हैं बनाने के लिए कोशिश कर रहा हूँ

Call to undefined method SimpleXMLElement::getElementsByTagName() on ... 

नीचे एक्सएमएल फ़ाइल मैं से पढ़ रहा हूँ है एक foreach पाश में डेटा।

उत्तर

22

SimpleXML में getElementsByTagName() विधि (DOMDocument करता है) नहीं है।

SimpleXML में, ऑब्जेक्ट (उदा। $xml) को मूल तत्व के रूप में माना जाता है।

$devices = array(); 

$xml = simplexml_load_string($xmlString); 
foreach($xml->products->item as $item) 
{ 
    $device = array(); 

    foreach($item as $key => $value) 
    { 
     $device[(string)$key] = (string)$value; 
    } 

    $devices[] = $device; 
} 

print_r($devices); 

आउटपुट:

$xml = simplexml_load_string($xmlString); 
foreach($xml->products->item as $item) 
{ 
    echo (string)$item->product_id; 
    echo (string)$item->model; 
} 

एक उपकरणों साहचर्य सरणी के निर्माण का उदाहरण:

Array 
(
    [0] => Array 
     (
      [product_id] => 32417 
      [manufacturer] => Alcatel 
      [model] => Sparq 2 
      [deeplink] => http://www.mysite.com/sc_offer?gid=32417 
      [thumbnail_URL] => http://www.mysite.com/images/devices/thumbs/Alcatel-Sparq-II.jpg 
      [image_URL] => http://www.mysite.com/images/devices/Alcatel-Sparq-II.jpg 
      [price_not_working] => 0.00 
      [price_poor] => 0.00 
      [price_fair] => 20.00 
      [price_good] => 25.00 
      [price_perfect] => 25.00 
      [price_new] => 25.00 
      [battery_new] => 1.00 
      [battery_perfect] => 1.00 
      [battery_good] => 1.00 
      [battery_fair] => 1.00 
      [battery_poor] => 0.00 
      [charger_new] => 1.00 
      [charger_perfect] => 1.00 
      [charger_good] => 1.00 
      [charger_fair] => 1.00 
      [charger_poor] => 0.00 
      [packaging_new] => 1.00 
      [packaging_perfect] => 1.00 
      [packaging_good] => 1.00 
      [packaging_fair] => 1.00 
      [packaging_poor] => 0.00 
     ) 

    [1] => Array 
     (
      [product_id] => 31303 
      [manufacturer] => Apple 
      [model] => iPhone 3G 8gb 
      [deeplink] => http://www.mysite.com/sc_offer?gid=31303 
      [thumbnail_URL] => http://www.mysite.com/images/devices/thumbs/iPhone 8 3G.jpg 
      [image_URL] => http://www.mysite.com/images/devices/iPhone 8 3G.jpg 
      [price_not_working] => 0.00 
      [price_poor] => 0.00 
      [price_fair] => 7.00 
      [price_good] => 2.00 
      [price_perfect] => 2.00 
      [price_new] => 2.00 
      [battery_new] => 1.00 
      [battery_perfect] => 1.00 
      [battery_good] => 1.00 
      [battery_fair] => 1.00 
      [battery_poor] => 0.00 
      [charger_new] => 1.00 
      [charger_perfect] => 1.00 
      [charger_good] => 1.00 
      [charger_fair] => 1.00 
      [charger_poor] => 0.00 
      [packaging_new] => 1.00 
      [packaging_perfect] => 1.00 
      [packaging_good] => 1.00 
      [packaging_fair] => 1.00 
      [packaging_poor] => 0.00 
     ) 

) 
+0

अतिरिक्त कोड के लिए +1 :) – Zabs

1

मैं the existing answer खराब करने के लिए नहीं करना चाहते हैं तो आप ऐसा जैसे उत्पाद आइटम के माध्यम से लूप कर सकते हैं क्योंकि यह एक सामान्य फैशन में सही जवाब दे रहा है।

अपने ठोस अपने XML के साथ के रूप में आवश्यकताओं के लिए वहाँ कोई गुण नहीं कर रहे हैं और तुम सिर्फ जोड़े यहाँ तत्व नाम => नोड मूल्य के लिए देख रहे हैं, वहाँ एक समारोह में मन में आता है है SimpleXMLElement के साथ संयोजन: get_object_vars

यह उपयोगी है जब भी आप एक सरणी में एक वस्तु के रूप में परिवर्तित करने और SimpleXMLElement वस्तु संपत्ति के नाम में तत्व नाम बदल जाता है और नोड मूल्यों के रूप में उन संपत्ति यह बहुत सीधे यहाँ आगे के मूल्यों:

$xml  = simplexml_load_string($buffer); 

$items = $xml->products->item; 

$devices = array_map('get_object_vars', iterator_to_array($items, FALSE)); 

print_r($devices); 

उत्पादन होता है जैसा कि मौजूदा उत्तर में सुझाया गया है। और ऑनलाइन डेमो यहां है: https://eval.in/57109

आप संभवतः सरणी को कास्टिंग के साथ समान परिणाम प्राप्त करने में सक्षम होंगे (यदि सिंपलएक्सएमएल के साथ बिल्कुल समान नहीं है), हालांकि इस मामले में मैं इसे मैप करना चाहता था, मुझे एक सच्चे कार्य की आवश्यकता थी।

वहाँ भी है json-एन और -de-कोड पूरा पेड़ है, जो यहां भी काम में आता परिवर्तित करने के लिए दोगुना:

$xml  = simplexml_load_string($buffer); 

$items = $xml->products; 

$devices = json_decode(json_encode($items), TRUE)['item']; 

उत्पादन तो फिर मौजूदा जवाब के रूप में वास्तव में है। और ऑनलाइन डेमो फिर से है: https://eval.in/57117

आशा है कि यह सहायक होगा और थोड़ा सा दृश्य बढ़ाएगा।

+0

पहले से ही उत्तर दिए गए प्रश्न के लिए अतिरिक्त विवरण देने के लिए शानदार +1 - धन्यवाद! – Zabs

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