nvashenko/xml-streamer

流式传输XML数据并将类型转换为提供的类映射。

1.5.6 2022-04-06 14:51 UTC

This package is auto-updated.

Last update: 2024-09-06 19:56:12 UTC


README

Latest Version on Packagist Build Status

内容

安装

您可以通过composer安装此包

composer require tbpixel/xml-streamer

目的

我发现我需要一种高效处理大量XML数据的方法。PHP提供的内置XMLReader既快又高效,但有时使用起来可能会有点麻烦。我想有一个无依赖的方式来流式传输XML数据并使用我提供的类映射来处理它。

此包旨在缓解使用XMLReader的一些痛点,同时提供一组PSR-7兼容的XML流。它提供了一种方便的方法来迭代大型XML数据集,以减少内存使用。

还提供了一个可选客户端,允许将XML字符串转换为类映射对象。

示例

假设我们有一个名为users.xml的XML文件,包含以下数据

<?xml version='1.0' encoding='UTF-8'?>
<users>
    <user>
        <id>1</id>
        <name>John Doe</name>
    </user>
    <user>
        <id>2</id>
        <name>Theodor</name>
    </user>
</users>

使用此包,我们可以简单地创建一个新的Client,传入一个PSR-7兼容的流,并使用我们自己的类型来处理我们的数据。

$stream = new \TBPixel\XMLStreamer\Streams\FileReaderStream('users.xml', 1);
$client = new \TBPixel\XMLStreamer\Client($stream);

foreach ($client->iterate() as $simpleXMLElement) {
    // Do something with the SimpleXMLElement
}

$client->close(); // Closes the client's provided stream

我们还可以直接循环客户端,因为它实现了IteratorAggregate接口。

// Same as above loop
foreach ($client as $simpleXMLElement) {
    // Do something with the SimpleXMLElement
}

迭代深度

ReaderStream,此包中发现的流实现的底层XMLReader包装器,包含一个名为$depth的最终构造参数。这是一个整数(默认为0)或字符串,表示开始迭代XML文档中找到的记录的深度。

字符串可以是XML标签的名称,允许流迭代直到找到该标签,而无需事先知道深度。

给定与上述相同的数据,我们可以将我们的代码片段重写如下

$stream = new \TBPixel\XMLStreamer\Streams\FileReaderStream('users.xml', 'users');
$client = new \TBPixel\XMLStreamer\Client($stream);

foreach ($client->iterate() as $simpleXMLElement) {
    // Do something with the SimpleXMLElement
}

$client->close(); // Closes the client's provided stream

之前的值1对于迭代此结果集是可接受的,但如果数据被任意级别的深度包装,则这种方法变得方便。

自动转换

如果我们有一个实现了所需的CreateFromSimpleXML接口的用户,我们还可以在迭代时将SimpleXMLElement转换为,以便更容易访问。

use TBPixel\XMLStreamer\CreateFromSimpleXML;

class User implements CreateFromSimpleXML
{
    /** @var int */
    public $id;

    /** @var string */
    public $name;

    public function __construct(int $id, string $name)
    {
        $this->id = $id;
        $this->name = $name;
    }

    /**
     * Create a new instance from a Simple XML Element.
     *
     * @return static
     */
    public static function fromSimpleXML(\SimpleXMLElement $element)
    {
        return new static(
            (int) $element->id,
            (string) $element->name
        );
    }
}

现在,当我们创建我们的客户端时,我们只需将FQCN传递给客户端的类映射,转换将自动完成。

$stream = new \TBPixel\XMLStreamer\Streams\FileReaderStream('users.xml');
$client = new \TBPixel\XMLStreamer\Client($stream, [
    'user' => User::class,
]);

foreach ($client->iterate() as $user) {
    // Work with the User object.
}

$client->close();

客户端的第二个参数是一个键值对数组,将XML元素名称映射到FQCN。

扩展

客户端和流都是基于PSR-7的Psr\Http\Message\StreamInterface构建的,这意味着您应该能够用您自己的实现替换流。如果您计划使用XMLReader但想使用不同的资源处理程序,TBPixel\XMLStreamer\ReaderStream是一个抽象实现,它期望通过XMLReader处理XML流,并且处理大多数功能都很不错。

贡献

有关详细信息,请参阅CONTRIBUTING

变更日志

有关最近更改的更多信息,请参阅CHANGELOG

支持我

嗨!我是住在加拿大不列颠哥伦比亚省温哥华的软件开发者。房地产市场真是太艰难了。如果您想支持我,请考虑在Twitter @TBPixel上关注我,或者考虑为我买杯咖啡

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件