digitalkaoz/xml-filter

filter data out of xml documents

1.0 2016-10-02 21:39 UTC

This package is not auto-updated.

Last update: 2024-12-21 21:25:37 UTC


README

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

Build Status Dependency Status Scrutinizer Code Quality Code Coverage SensioLabsInsight Latest Stable Version Total Downloads StyleCI

Installation

$ composer install

Example

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]
]

Parse a RSS Feed

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);

Usage

PHAR

to build a phar simply run

$ composer build

Tests

$ composer test-all