tbpixel/xml-streamer

将XML数据流转换为指定的类映射。

1.5.3 2019-03-14 16:58 UTC

This package is auto-updated.

Last update: 2024-09-24 05:10:49 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>

使用此包,我们可以简单地创建一个新的客户端,传递给它一个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

支持我

嗨!我是一个住在BC省温哥华的开发者。如果你们想支持我,可以考虑在Twitter @TBPixel上关注我,或者考虑买我一杯咖啡

许可证

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