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.
На этом у меня всё, надеюсь материал оказался полезным!