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
v4.0.0
2026-07-15 10:40 UTC
Requires
- php: >=8.3
- ext-libxml: *
- ext-mbstring: *
- ext-simplexml: *
- ext-xmlreader: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.95
- phpstan/phpstan: ^2.2
- phpunit/phpunit: ^12.0 || ^13.0
This package is auto-updated.
Last update: 2026-07-15 10:41:41 UTC
README
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