2013-10-24 10 views
5

Sto cercando di utilizzare SimpleXML in PHP per scorrere un oggetto XML - il formato oggetto è qui sotto: -Loop attraverso un oggetto XML con SimpleXML

ottengo il seguente errore quando si tenta di ottenere i tag degli elementi da nome - qualcuno può spiegare cosa sto facendo male?

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

Di seguito si riporta il file XML che sto leggendo da:

<?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> 

Il mio codice PHP è qui sotto:

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

Sto cercando di rendere i dispositivi una matrice modo da poter utilizzare il dati in un ciclo di foreach.

risposta

22

SimpleXML non ha un metodo getElementsByTagName() (fa DOMDocument).

In SimpleXML, l'oggetto (ad esempio $xml) viene considerato come elemento radice. Quindi, è possibile scorrere le voci di prodotto in questo modo:

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

Esempio di costruzione di un array associativo dispositivi:

$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); 

Uscite:

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 per il codice aggiuntivo :) – Zabs

1

non voglio rovinare the existing answer come risponde correttamente e in generale.

Per le tue requisiti concreti come con il vostro XML non ci sono attributi e si sta solo cercando il elemento-name => del nodo-valore coppie qui, c'è una funzione che viene in mente a congiunzione con SimpleXMLElement qui: get_object_vars.

E 'utile ogni volta che si converte un oggetto in un array e come SimpleXMLElement trasforma i nomi di elemento in nomi di proprietà degli oggetti e il nodo di valori come valori quelli di proprietà è piuttosto semplice qui:

$xml  = simplexml_load_string($buffer); 

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

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

print_r($devices); 

L'uscita è come suggerito nella risposta esistente. E la demo online è qui: https://eval.in/57109.

È probabile che sia possibile ottenere risultati simili con il cast degli array (se non esattamente lo stesso con SimpleXML), tuttavia in questo caso, poiché volevo mapparlo, avevo bisogno di una vera funzione.

C'è anche il JSON-en-e-de-codice raddoppio per la conversione di alberi completi, che torna utile anche qui:

$xml  = simplexml_load_string($buffer); 

$items = $xml->products; 

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

L'uscita poi di nuovo è esattamente come la risposta esistente. E la demo online è di nuovo qui: https://eval.in/57117

Spero che questo sia utile e allarga un po 'la vista.

+0

Superbo +1 per dare ulteriori dettagli a una domanda già risposta - grazie ancora! – Zabs