XML универсальный язык разметки данных, и на сегодняшний день широко используется для обмена данными между различными системами. На практике довольно часто требуется работать с XML файлами, парсить различного рода информацию из XML-файлов. После чего информацию можно записывать в базу данных, либо выполнять какие-либо операции с данными. Существуют множество различных стандартов XML для обмена данными, и целесообразно иметь библиотеку для упрощения работы с подобными типами данных.
Начиная с PHP 5 версии появилось расширение SimpleXML, которое в значительной степени помогает работать с XML фидами, и упрощает этот процесс. Как правило на хостингах расширение SimpleXML включено по умолчанию, поэтому выполнять каких-либо манипуляций с настройками хостинга вам не придётся.
Рассмотрим пример парсинга XML файла, для наглядности возьмём фид для Яндекс.Маркета, оформленный по стандарту YML.
Создаём пустой файл, с именем YML_sample.xml, добавляем в него следующее содержимое.
<?xml version="1.0" encoding="UTF-8"?> <yml_catalog date="2019-11-01 17:22"> <shop> <name>BestSeller</name> <company>Tne Best inc.</company> <url>http://best.seller.ru</url> <platform>uCoz</platform> <version>1.0</version> <agency>Технологичные решения</agency> <email>example-email@gmail.com</email> <currencies> <currency id="RUR" rate="1"/> <currency id="USD" rate="60"/> </currencies> <categories> <category id="1">Бытовая техника</category> <category id="10" parentId="1">Мелкая техника для кухни</category> <category id="101" parentId="10">Сэндвичницы и приборы для выпечки</category> </categories> <delivery-options> <option cost="200" days="1"/> </delivery-options> <pickup-options> <option cost="200" days="1"/> </pickup-options> <offers> <offer id="9012" bid="80"> <name>Мороженица Brand 3811</name> <vendor>Brand</vendor> <vendorCode>A1234567B</vendorCode> <url>http://best.seller.ru/product_page.asp?pid=12345</url> <price>8990</price> <oldprice>9990</oldprice> <enable_auto_discounts>true</enable_auto_discounts> <currencyId>RUR</currencyId> <categoryId>101</categoryId> <picture>http://best.seller.ru/img/model_12345.jpg</picture> <delivery>true</delivery> <pickup>true</pickup> <delivery-options> <option cost="300" days="1" order-before="18"/> </delivery-options> <pickup-options> <option cost="300" days="1-3"/> </pickup-options> <store>true</store> <description> <![CDATA[ <h3>Мороженица Brand 3811</h3> <p>Это прибор, который придётся по вкусу всем любителям десертов и сладостей, ведь с его помощью вы сможете делать вкусное домашнее мороженое из натуральных ингредиентов.</p> ]]> </description> <sales_notes>Необходима предоплата.</sales_notes> <manufacturer_warranty>true</manufacturer_warranty> <country_of_origin>Китай</country_of_origin> <barcode>4601546021298</barcode> <param name="Цвет">белый</param> <condition type="likenew"> <reason>Повреждена упаковка</reason> </condition> <credit-template id="20034"/> <weight>3.6</weight> <dimensions>20.1/20.551/22.5</dimensions> </offer> <offer id="12346" type="vendor.model" bid="60"> <typePrefix>Сэндвичница</typePrefix> <vendor>Brand</vendor> <model>K220Y9</model> <vendorCode>A1234567B</vendorCode> <url>http://best.seller.ru/product_page.asp?pid=12345</url> <price>1099</price> <oldprice>1399</oldprice> <enable_auto_discounts>false</enable_auto_discounts> <currencyId>RUR</currencyId> <categoryId>101</categoryId> <picture>http://best.seller.ru/img/device56789.jpg</picture> <delivery>false</delivery> <pickup>true</pickup> <pickup-options> <option cost="350" days="1" order-before="12"/> </pickup-options> <param name="Мощность">750 Вт</param> <description>Сэндвичница 2 в 1: можно приготовить как сэндвичи, так и вафли.</description> <sales_notes>Наличные, Visa/Mastercard, б/н расчет</sales_notes> <store>false</store> <manufacturer_warranty>true</manufacturer_warranty> <country_of_origin>Россия</country_of_origin> <barcode>9876543210</barcode> <weight>1.03</weight> <dimensions>20.800/23.500/9.000</dimensions> </offer> </offers> <gifts> <gift id="33"> <name>Кружка 300 мл Brand 16</name> <picture>https://best.seller.ru/promos/33.jpg</picture> </gift> </gifts> <promos> <promo id="PromoGift" type="gift with purchase"> <start-date>2020-02-01 09:00:00</start-date> <end-date>2020-03-01 22:00:00</end-date> <description>Купите бытовую технику марки Brand и получите кружку в подарок.</description> <url>http://best.seller.ru/promos/gift</url> <purchase> <product offer-id="9012"/> <product offer-id="12346"/> </purchase> <promo-gifts> <promo-gift offer-id="9012"/> <promo-gift gift-id="33"/> </promo-gifts> </promo> </promos> </shop> </yml_catalog>
Не смотря на сложность ветвления узлов в файле фида, работать с ним можно довольно просто. Давайте теперь создадим PHP-скрипт, который будет получать данные из файла фида.
$feedObj = simplexml_load_file("YML_sample.xml"); echo '<pre>'; print_r ($feedObj); echo '</pre>';
В переменную $feedObj попадает объект, который содержит все узлы фида. Имея объект в качестве значения переменной, мы можем работать с ним согласно синтаксису PHP. К примеру, мы может перебрать все товарные предложения в цикле foreach:
$feedObj = simplexml_load_file("YML_sample.xml"); foreach ($feedObj->shop->offers->offer as $offer){ echo '<pre>'; print_r ($offer); echo '</pre>'; }
Аналогичным образом можно работать и с другими узлами в документе. Стоит помнить один важный момент. При работе с большими объемами данных XML файла, всё это дело будет занимать больше времени на обработку, по этой причине нужно внимательно подходить к использованию SimpleXML. Ранее на нашем сайте публиковался пост, показывающий парсинг курса валют с удалённого ресурса банка. В том примере так же используется расширение SimpleXML.
На этом у меня всё, надеюсь материал оказался полезным!