borsodigerii/php-xml-chunker

一个轻量级、快速且经过优化的XML文件分割器,内置标签数据验证,使用XMLParser库编写。其主要目的是将XML文件分割成多个小块(因此得名),然后将其保存为多个不同的XML小文件。

2.0.0 2023-10-16 15:33 UTC

This package is auto-updated.

Last update: 2024-09-26 08:56:55 UTC


README

GitHub Workflow Status (with event) GitHub GitHub release (with filter)

此库的主要目标是创建具有预定义大小的大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);