sirian/yandex-market-language-parser

There is no license information available for the latest version (v4.0.0) of this package.

Yandex Market Language parser

Maintainers

Package info

github.com/sirian/php-yml-parser

pkg:composer/sirian/yandex-market-language-parser

Transparency log

Statistics

Installs: 46 752

Dependents: 0

Suggesters: 0

Stars: 18

Open Issues: 2

v4.0.0 2026-07-15 10:40 UTC

This package is auto-updated.

Last update: 2026-07-15 10:41:41 UTC


README

CI

Streaming parser for Yandex Market Language (YML) feeds.

Uses XMLReader for the outer scan and SimpleXMLElement for per-offer parsing, so the whole catalog is never loaded in memory — offers arrive as a Generator.

Requirements

  • PHP >= 8.3
  • Extensions: ext-mbstring, ext-simplexml, ext-xmlreader, ext-libxml

Installation

composer require sirian/yandex-market-language-parser

Usage

use Sirian\YMLParser\Parser;

$parser = new Parser();
$result = $parser->parse('/path/to/catalog.xml');

$shop = $result->getShop();
echo $shop->getName();

foreach ($shop->getCategories() as $category) {
    echo $category->getId(), ': ', $category->getName(), "\n";
}

foreach ($result->getOffers() as $offer) {
    echo $offer->getId(), '', $offer->getName(), "\n";
}

Offer types

Sirian\YMLParser\Factory\Factory::createOffer() returns:

type attribute class
vendor.model Sirian\YMLParser\Model\Offer\VendorModelOffer
book Sirian\YMLParser\Model\Offer\BookOffer
anything else Sirian\YMLParser\Model\Offer\Offer
absent Sirian\YMLParser\Model\Offer\VendorModelOffer (default)

Customization

Provide a custom FactoryInterface to swap any model/storage implementation:

use Sirian\YMLParser\Factory\Factory;
use Sirian\YMLParser\Model\Offer\Offer;
use Sirian\YMLParser\Parser;

$factory = new class () extends Factory {
    public function createOffer(string $type): Offer
    {
        // return your own subclass
        return parent::createOffer($type);
    }
};

$parser = new Parser($factory);

Extending offer field mapping

Offer::applyField(string $field, string $value): bool maps XML child elements onto setters. Override it in your own offer subclass to handle YML fields beyond the built-in ones:

final class MyOffer extends VendorModelOffer
{
    public function applyField(string $field, string $value): bool
    {
        if ('country_of_origin' === $field) {
            $this->country = $value;
            return true;
        }

        return parent::applyField($field, $value);
    }
}

Any field can also be accessed via the raw XML — $offer->getXml() / $shop->getXml().

Development

composer install
vendor/bin/phpunit        # tests + coverage
vendor/bin/phpstan analyse # static analysis (level 8)
vendor/bin/php-cs-fixer fix --dry-run --diff  # code style

License

MIT