tbpixel / xml-streamer
将XML数据流转换为指定的类映射。
Requires
- php: ^7.2
- psr/http-message: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.14
- infection/infection: ^0.12.2
- phpstan/phpstan: ^0.11.1
- phpunit/phpunit: ^8.0
- 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>
使用此包,我们可以简单地创建一个新的客户端,传递给它一个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)。有关更多信息,请参阅许可证文件。