netlogix / xml-processor
PHP XML-Processor based on XMLReader
Requires
- php: ^7.4 || ^8.0
- ext-xmlreader: *
Requires (Dev)
- behat/behat: ^3.12.0
- phpunit/phpunit: ^9.6.6
This package is auto-updated.
Last update: 2024-10-26 09:11:50 UTC
README
PHP XML-Processor based on XMLReader.
The XMLProcessor
walks through the XML-file with the \XMLReader
and fires events on each node of the \XMLReader
.
So its ease to process huge XML files with low memory usage.
Events
The following events are available:
How to use
To process an XML file, you need to create a nodeProcessor class.
It has to implement the NodeProcessorInterface
.
Where you can define NodeProcessorInterface::getSubscribedEvents
on which events you want to react.
For easier use, you can extend the AbstractNodeProcessor
class and implement one of the following interfaces:
Example
To extract all values of <value>
nodes of the following XML:
file.xml
<?xml version="1.0" encoding="UTF-8"?> <root> <value>foo</value> <value>bar</value> <value>baz</value> </root>
Create a simple nodeProcessor class which collect all values of the <value>
nodes.
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; } }
Create a new instance of the XmlProcessor
class and attach the new 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());
result:
array(3) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> string(3) "baz" }