2013-10-24 8 views
5

持つXMLオブジェクトを介して私は、XMLオブジェクトを介してループにPHPでのSimpleXMLを使用しようとしています - オブジェクトの形式は以下の通りです: -ループはSimpleXMLを

私はで要素タグを取得しようとすると、私は次のエラーを取得します名前 - 誰でも私が間違っていることを説明できますか?以下は

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

私はから読んでいるXMLファイルされる:

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

私が使用できるように、デバイスに配列を作るしようとしていますforeachループ内のデータ

答えて

22

SimpleXMLにはgetElementsByTagName()メソッドがありません(DOMDocumentが行います)。

SimpleXMLでは、オブジェクト(例:$xml)はルート要素として扱われます。だから、そのような製品の項目をループすることができますデバイス連想配列を構築する

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

例:

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

出力:

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です。

配列にキャストしても同様の結果が得られる可能性がありますが(SimpleXMLとまったく同じでない場合)、この場合はマップしたいので、本当の関数が必要でした。

JSONエン、あまりにも、ここでは便利になる完全な木を、変換するための倍増-de-コードもあります:

$xml  = simplexml_load_string($buffer); 

$items = $xml->products; 

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

出力は再び既存の答えとして正確ですが。また、オンラインデモはもう一度ここにあります:https://eval.in/57117

これは役に立ちます。

+0

既に+1された質問に余分な細部を与えるための優れた+1 - もう一度ありがとう! – Zabs