prewk / xml-streamer
Stream large XML files with low memory consumption.
Installs: 40 626
Dependents: 0
Suggesters: 0
Security: 0
Stars: 51
Watchers: 8
Forks: 32
Open Issues: 0
Requires
- php: >=5.3.0
This package is auto-updated.
Last update: 2024-10-29 03:58:37 UTC
README
This project is discontinued, I recommend using its successor xml-string-streamer instead.
About
Written by oskar.thornblad@gmail.com.
Contributions from:
- Valiton GmbH
- Michael Härtl
Licensed under the MIT license.
Installation
Install with composer by adding the following to your composer.json file:
{ "require": { "prewk/xml-streamer": "dev-master" } }
Then, run composer install
(assuming you have composer installed.)
Usage
Extend the class and implement the processNode()
method.
Example
<?php class SimpleXmlStreamer extends \Prewk\XmlStreamer { public function processNode($xmlString, $elementName, $nodeIndex) { $xml = simplexml_load_string($xmlString); $something = (string)$xml->Something->SomethingElse->ReadThis; echo "$nodeIndex: Extracted string '$something' from parent node '$elementName'\n"; return true; } } $streamer = new SimpleXmlStreamer("myLargeXmlFile.xml"); if ($streamer->parse()) { echo "Finished successfully"; } else { echo "Couldn't find root node"; }
Advanced example
To improve performance on DB inserts you can also make use of the chunkCompleted()
method.
It gets called after a chunk of data was processed.
<?php class SimpleXmlStreamer extends \Prewk\XmlStreamer { protected $pdo; protected $sql = array(); protected $values = array(); /** * Called after the constructor completed class setup */ public function init() { $this->pdo = new PDO('mysql:host=localhost;dbname=test', 'user','pass'); } public function processNode($xmlString, $elementName, $nodeIndex) { $xml = simplexml_load_string($xmlString); $this->sql[] = '(?,?,?)'; $this->values[] = (string)$xml->name; $this->values[] = (string)$xml->email; $this->values[] = (string)$xml->phone; } /** * Called after a file chunk was processed (16KB by default, see constructor) */ public function chunkCompleted() { if($this->sql===array()) { return; } $command = $this->pdo->prepare('INSERT INTO mytable VALUES '.implode(',',$this->sql)); $command->execute($this->values); $this->sql = $this->values = array(); } }