borsodigerii / php-xml-chunker
一个轻量级、快速且经过优化的XML文件分割器,内置标签数据验证,使用XMLParser库编写。其主要目的是将XML文件分割成多个小块(因此得名),然后将其保存为多个不同的XML小文件。
Requires
- php: >=7.4.0
README
此库的主要目标是创建具有预定义大小的大XML文件块(或者说将其分割成多个块)。
该算法使用XMLParser php库编写,该库能够逐行(或逐标签)解析XML文件,而不需要状态控制,也不通过字符串到字符串的比较或简单的I/O操作。这个库的特性使得在解析这些标签时实施验证成为可能。
指定正确的字符集后,它可以处理特殊字符,并对它们进行验证。
安装
您可以通过下载 src\Chunker.php
文件并直接使用它,或者通过 使用composer 作为您的包管理器来使用此库
$ composer require borsodigerii/php-xml-chunker
或者,您可以在您的 composer.json
文件中将此库作为依赖项添加
"require": { "borsodigerii/php-xml-chunker": "2.0.0" }
然后,您只需运行 composer update
。
此库运行所需的最小PHP版本为 >= 7.4.0
用法
简单分割
实现是面向对象的,因此为了分割文件,必须首先创建一个Chunker实例。
一个简单示例,没有验证,每个块最多包含 100 个主标签,输出文件名为 "out-{CHUNK}.xml"
$chunkSize = 100; $outputFilePrefix = "out-"; $xmlfile = "bigFile.xml"; $validationFunction = fn($data, $tag) => { return true; } $checkingTags = array(); $chunker = new Chunker\Chunker($xmlfile, $chunkSize, $outputFilePrefix, $validationFunction, $checkingTags);
构造函数变量
以下表格包含可以(并且应该)传递给构造函数的参数。
如果任何必需的参数为空/未指定,将引发致命错误。
启动分割
创建Chunker实例并设置所有参数后,您可以使用Chunker::chunkXML
方法开始分割过程。以下是一个示例
// ... the instance is created in $chunker $chunker.chunkXML("item", "root");
此示例将创建来自大文件的XML块(如果启用验证,则仅包含已验证的主标签),每个块包含$chunkSize
个主标签(这里称为"item")。每个主标签都包含在一个根标签(这里称为"root")中,每个文件中(因此每个分割文件将包含一个根标签,以及其中的$chunkSize
个主标签)。
该方法返回日志会话的字符串转换(请参阅以下内容以获取更多信息)。
日志
该类具有实现日志功能。每次运行Chunker::chunkXML
时,都会启动一个新的日志会话,该会话可以通过相同的函数检索。运行完成后,它将返回转换为字符串的日志会话
// ... $log = $chunker.chunkXML(....); echo $log; /* [timestamp] Starting new chunking... [timestamp] .. [timestamp] .. */
当某些东西不符合您的需求并且需要逐步调试时,这非常有帮助。 不需要捕获,因此您可以像调用其返回值是void一样调用该函数。
示例
基本验证
假设您有一个XML文件("feed.xml"),其中有一个Shop根元素,以及多个shopItem元素(10,000+)
<?xml version="1.0" encoding="utf-8"?> <Shop> <...> <shopItem> <...> <weight_kg>5</weight_kg> <...> </shopItem> <shopItem> <...> <weight_kg>12</weight_kg> <...> </shopItem> <...> </Shop>
您希望将其分割成名为"feed-{chunk}.xml"的文件,每个文件最多包含1000个shopItem。您还希望仅包含包含weight_kg标签的shopItem,该标签只能大于10(或'10 kgs')。解决方案如下
$chunkSize = 1000; // Max. 1000 shopItems per chunk $xmlfile = "feed.xml"; // Input file $outPrefix = "feed-"; // Prefix for chunk-files $checkingTags = array("weight_kg"); // Tags to be validated (to which the validation function will be called) // validation function function validation($data, $tag) { if($tag == "weight_kg"){ if(!empty($data) && intval($data) > 10) return true; } return false; } // Tags to be counted with $chunkSize $mainTag = "shopItem"; // Root tag/element, that is only present once in the xml file $rootTag = "Shop"; // Creating the chunker instance, and running the Chunker $chunker = new Chunker\Chunker($xmlfile, $chunkSize, $outPrefix, "validation", $chekingTags); $chunker.chunkXML($mainTag, $rootTag);