Я пытаюсь использовать SimpleXML в PHP для прокрутки объекта XML – формат объекта ниже: –
Я получаю следующую ошибку, когда пытаюсь получить теги элементов по имени – может ли кто-нибудь объяснить, что я делаю неправильно?
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>
,<?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.
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 ) )
Я не хочу испортить существующий ответ, поскольку он отвечает правильной в общем.
Для ваших конкретных требований, как и для вашего XML, нет никаких атрибутов, и вы просто ищете пары element-name => node-value здесь, есть одна функция, которая приходит на ум вместе с 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-en- и -de-кода для преобразования полных деревьев, что также очень полезно здесь:
$xml = simplexml_load_string($buffer); $items = $xml->products; $devices = json_decode(json_encode($items), TRUE)['item'];
Результат снова совпадает с существующим ответом. И онлайн-демо снова здесь: https://eval.in/57117
Надеюсь, что это поможет и немного расширит представление.