0

I would like to parse huge xml in PSR-7 response. Defaults XmlReader looks good, but it seems it can't use PSR-7 StreamInterface.

My XML looks:

<root>
  <item>
   ...
  </item>
  <item>
   ...
  </item>
</root>

I would like to use something like:


$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'http://example.com/large.xml');

$streamer = new MyXmlStreamer($response->getBody());

while ($item = $streamer->getNode()) {
    var_dump($item); // where $item would be item outerXml
}

Any ideas how to achieve this?

venca
  • 1,196
  • 5
  • 18

1 Answers1

0

You could use xml-string-streamer:

$client = new GuzzleHttp\Client();
$response = $client->request('GET', 'http://example.com/large.xml');

$stream = $response->getBody();

// Construct the default parser (StringWalker)
$parser = new Parser\StringWalker();

// Create the streamer
$streamer = new XmlStringStreamer($parser, $stream);

// Iterate through nodes
while ($node = $streamer->getNode()) {
   $simpleXmlNode = simplexml_load_string($node);
   //echo (string)$simpleXmlNode->firstName;
 }
  • xml-string-streamer cannot use PSR-7 StreamInterface directly. It could be used with little [wrapper](https://gist.github.com/vaclavvanik/aa4f87121dde819dd17b47aacce8bc8d). Thats little pitty, xml-string-streamer seems not to be well maintained :-/ – venca Jul 29 '19 at 07:35
  • other option: [https://github.com/TBPixel/xml-streamer](https://github.com/TBPixel/xml-streamer) – Manuel Baena García Jul 29 '19 at 20:17