netlogix/xml-processor

基于XMLReader的PHP XML-Processor

1.1.0 2023-04-06 08:17 UTC

This package is auto-updated.

Last update: 2024-09-04 11:40:23 UTC


README

PHP XML-Processor基于XMLReader。

XMLProcessor使用\XMLReader遍历XML文件,并在\XMLReader的每个节点上触发事件。因此,它易于处理大型XML文件,同时内存使用量低。

事件

以下事件可用

如何使用

要处理XML文件,您需要创建一个nodeProcessor类。它必须实现NodeProcessorInterface

您可以在其中定义NodeProcessorInterface::getSubscribedEvents,指定您想要响应的事件。

为了更方便地使用,您可以扩展AbstractNodeProcessor类并实现以下接口之一

示例

要从以下XML中提取所有<value>节点的值

file.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <value>foo</value>
    <value>bar</value>
    <value>baz</value>
</root>

创建一个简单的nodeProcessor类,收集所有<value>节点的值。

OpenTestNodeProcessor.php

use Netlogix\XmlProcessor\NodeProcessor\AbstractNodeProcessor;
use Netlogix\XmlProcessor\NodeProcessor\OpenNodeProcessorInterface;
use Netlogix\XmlProcessor\NodeProcessor\Context\OpenContext;

class OpenValueNodeProcessor extends AbstractNodeProcessor implements OpenNodeProcessorInterface
{
    const NODE_PATH = 'value';
    private $nodeValues = [];

    public function openElement(OpenContext $context)
    {
        $xml = $context->getXmlProcessorContext()->getXmlReader();
        $node = $xml->expand();
        $this->nodeValues[] = $node->nodeValue;
    }

    function getNodeValues(): array
    {
        return $this->nodeValues;
    }
}

创建XmlProcessor类的新实例,并附加新的nodeProcessor。

require_once 'OpenTestNodeProcessor.php';

require_once 'vendor/autoload.php';

$valueNodeProcessor = new OpenValueNodeProcessor();
$processor = new XMLProcessor([$valueNodeProcessor]);
$processor->processFile('file.xml');

var_dump($valueNodeProcessor->getNodeValues());

结果

array(3) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(3) "baz"
}