progerwtf/stream-parser

PHP 多格式流解析器

资助包维护!
Patreon

安装: 4

依赖: 0

建议: 0

安全: 0

星标: 0

关注者: 1

分支: 46

v1.2 2018-10-29 10:35 UTC

This package is auto-updated.

Last update: 2024-09-05 12:38:09 UTC


README

Build Status Latest Version on Packagist Quality Score Code Coverage License

在解析XML/CSV/JSON/...文档时,有两种方法可以考虑

DOM加载:加载整个文档,便于导航和解析,因此为开发者提供最大灵活性。

流式处理:表示遍历文档,类似于光标,在每个元素处停止,从而避免内存过度消耗。

https://www.linkedin.com/pulse/processing-xml-documents-dom-vs-streaming-marius-ilina/

因此,对于大文件,回调将在文件下载期间执行,并且从内存角度来看将更加高效。

安装

composer require rodenastyle/stream-parser

推荐用法

尽可能委托回调执行,以免阻塞文档读取

(基于Laravel Queue的示例)

use Tightenco\Collect\Support\Collection;

StreamParser::xml("https://example.com/users.xml")->each(function(Collection $user){
    dispatch(new App\Jobs\SendEmail($user));
});

实用的输入/代码/输出演示

XML

<bookstore>
    <book ISBN="10-000000-001">
        <title>The Iliad and The Odyssey</title>
        <price>12.95</price>
        <comments>
            <userComment rating="4">
                Best translation I've read.
            </userComment>
            <userComment rating="2">
                I like other versions better.
            </userComment>
        </comments>
    </book>
    [...]
</bookstore>
use Tightenco\Collect\Support\Collection;

StreamParser::xml("https://example.com/books.xml")->each(function(Collection $book){
    var_dump($book);
    var_dump($book->get('comments')->toArray());
});
class Tightenco\Collect\Support\Collection#19 (1) {
  protected $items =>
  array(4) {
    'ISBN' =>
    string(13) "10-000000-001"
    'title' =>
    string(25) "The Iliad and The Odyssey"
    'price' =>
    string(5) "12.95"
    'comments' =>
    class Tightenco\Collect\Support\Collection#17 (1) {
      protected $items =>
      array(2) {
        ...
      }
    }
  }
}
array(2) {
  [0] =>
  array(2) {
    'rating' =>
    string(1) "4"
    'userComment' =>
    string(27) "Best translation I've read."
  }
  [1] =>
  array(2) {
    'rating' =>
    string(1) "2"
    'userComment' =>
    string(29) "I like other versions better."
  }
}

JSON

[
  {
    "title": "The Iliad and The Odyssey",
    "price": 12.95,
    "comments": [
      {"comment": "Best translation I've read."},
      {"comment": "I like other versions better."}
    ]
  },
  {
    "title": "Anthology of World Literature",
    "price": 24.95,
    "comments": [
      {"comment": "Needs more modern literature."},
      {"comment": "Excellent overview of world literature."}
    ]
  }
]
use Tightenco\Collect\Support\Collection;

StreamParser::json("https://example.com/books.json")->each(function(Collection $book){
    var_dump($book->get('comments')->count());
});
int(2)
int(2)

CSV

title,price,comments
The Iliad and The Odyssey,12.95,"Best translation I've read.,I like other versions better."
Anthology of World Literature,24.95,"Needs more modern literature.,Excellent overview of world literature."
use Tightenco\Collect\Support\Collection;

StreamParser::csv("https://example.com/books.csv")->each(function(Collection $book){
    var_dump($book->get('comments')->last());
});
string(29) "I like other versions better."
string(39) "Excellent overview of world literature."

许可证

此库基于MIT许可证发布。