Отправка сообщения






Парсинг XML в PHP

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

Опубликован: 26.06.2020 г.
 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии

  • Загрузка...

Наверх