nvashenko / xml-streamer
流式传输XML数据并将类型转换为提供的类映射。
Requires
- php: ^7.1
- psr/http-message: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.14
- infection/infection: ^0.12.2
- symfony/var-dumper: ^4.2
README
内容
安装
您可以通过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)。有关更多信息,请参阅许可证文件。