this library lets you filter complex Data-Structures out of XML Documents into some Array Structure (nested Arrays, Maps, Strings ...).
- It is capable of using different XML Backends (
\SimpleXml*
or\Dom*
or even your Own) - It has Support for Type-Casting, Sorting, Validation, Reference-Checking, Conditional-Inclusion, Post-Processing, Merging, Aggregating and ...
- It is extendable (it uses Pimple behind the curtain), so you can provide your own Filter, or override nearly every part
$ composer install
Given I Have the following XML Document
<doc>
<foo>foo</foo>
<bar>20</bar>
<bar>30</bar>
<bar>10</bar>
</doc>
When I use the following Configuration (while using the
Yaml
Loader)
Rs\XmlFilter\Filter\AggregateFilter:
mappings:
bazz:
filter: Rs\XmlFilter\Filter\AggregateFilter
mappings:
foo: "/doc/foo"
bar:
path: "/doc/bar"
cast: "int"
sort: true
multiple: true
I want to get the following Array after filtering
[
'bazz' => [
'foo' => 'foo',
],
'bar' => [10, 20, 30]
]
Rs\XmlFilter\Filter\MapFilter:
basePath: //channel/item
key: ./guid
value:
filter: Rs\XmlFilter\Filter\AggregateFilter
mappings:
title: ./title
link: ./link
category: ./category
date: ./pubDate
text:
filter: Rs\XmlFilter\Filter\PostFilter
callable: strip_tags
real_filter:
filter: Rs\XmlFilter\Filter\ScalarFilter
path: ./description
$filter = \Rs\XmlFilter\XmlFilter::create();
$doc = $filter::load(file_get_contents('https://news.google.de/?output=rss'));
$config = new \Rs\XmlFilter\Loader\YamlLoader(__DIR__ . '/rss.yml');
$result = $filter->filter($doc, $config);
echo json_encode($result, JSON_PRETTY_PRINT);
to build a phar simply run
$ composer build
$ composer test-all