/** * @test */ function iteration() { $reader = new XMLReaderStub('<!-- comment --><root><child></child></root>'); $it = new XMLChildElementIterator($reader); $this->assertEquals(false, $it->valid()); $this->assertSame(null, $it->valid()); $it->rewind(); $this->assertEquals(true, $it->valid()); $this->assertEquals('child', $it->current()->getName()); $it->next(); $this->assertEquals(false, $it->valid()); $reader = new XMLReaderStub('<root><none></none><one><child></child></one><none></none></root>'); $base = new XMLElementIterator($reader); $base->rewind(); $root = $base->current(); $this->assertEquals('root', $root->getName()); $children = $root->getChildElements(); $this->assertEquals('root', $reader->name); $children->rewind(); $this->assertEquals('none', $reader->name); $children->next(); $this->assertEquals('one', $reader->name); $childChildren = new XMLChildElementIterator($reader); $this->assertEquals('child', $childChildren->current()->getName()); $childChildren->next(); $this->assertEquals(false, $childChildren->valid()); $this->assertEquals('none', $reader->name); $childChildren->next(); $this->assertEquals('none', $reader->name); $this->assertEquals(true, $children->valid()); $children->next(); $this->assertEquals(false, $children->valid()); // children w/o descendants $reader->rewind(); $expected = array('none', 'one', 'none'); $root = $base->current(); $this->assertEquals('root', $root->getName()); $index = 0; $count = 0; foreach ($root->getChildElements() as $index => $child) { $this->assertSame($count++, $index); $this->assertEquals($expected[$index], $reader->name); } $this->assertEquals(count($expected), $count); // children w/ descendants $reader->rewind(); $expected = array('none', 'one', 'child', 'none'); $root = $base->current(); $this->assertEquals('root', $root->getName()); $index = 0; $count = 0; foreach ($root->getChildElements(null, true) as $index => $child) { $this->assertSame($count++, $index); $this->assertEquals($expected[$index], $reader->name); } $this->assertEquals(count($expected), $count); }
/** * @test * @dataProvider provideStreamFiles * * @param $file */ public function readStream($file) { stream_wrapper_register('xmlseq', 'XMLSequenceStream'); $path = "xmlseq://" . $file; $count = 0; $xmlFileContents = array(); while (XMLSequenceStream::notAtEndOfSequence($path)) { $count++; $reader = new XMLReader(); $reader->open($path, 'UTF-8', LIBXML_COMPACT | LIBXML_PARSEHUGE); /** @var XMLElementIterator|XMLReaderNode $elements */ $elements = new XMLElementIterator($reader); $xmlFileContents[] = $elements->getSimpleXMLElement(); } XMLSequenceStream::clean(); stream_wrapper_unregister('xmlseq'); $this->assertGreaterThanOrEqual(2, $count, 'number of sequences'); }
/** * @test */ function iterateOverNamedElements() { $reader = new XMLReaderStub('<r><a>1</a><a>2</a><b>c</b><a>3</a></r>'); $it = new XMLElementIterator($reader, 'a'); $this->assertEquals(null, $it->valid()); $it->rewind(); $this->assertEquals(true, $it->valid()); $this->assertEquals('a', $it->current()->getName()); $it->next(); $this->assertEquals('a', $it->current()->getName()); $it->next(); $this->assertEquals('a', $it->current()->getName()); $this->assertEquals('3', $it); $it->next(); $this->assertEquals(false, $it->valid()); }
/** * @return XMLReaderNode|null */ public function current() { $this->didRewind || self::rewind(); return parent::current(); }
* * Copyright (C) 2014 hakre <http://hakre.wordpress.com> * * Example: Read XML from a file that contains a sequence of XML documents */ require 'xmlreader-iterators.php'; // require XMLReaderIterator library stream_wrapper_register('xmlseq', 'XMLSequenceStream'); // file is an excerpt from https://www.google.com/googlebooks/uspto-patents-grants-text.html - ipg140107.zip $path = 'xmlseq://compress.bzip2://data/sequence.xml.bz2'; printf("XMLReader over '%s':\n", basename($path)); $iteration = 1; while (XMLSequenceStream::notAtEndOfSequence($path)) { $reader = new XMLReader(); $reader->open($path); /** @var XMLElementIterator|XMLReaderNode $elements */ $elements = new XMLElementIterator($reader); $rootName = $elements->getName(); $names = array(); $elements->setName('name'); foreach ($elements as $index => $nameElement) { $name = preg_replace('~ et al.$~', '', ucfirst($nameElement)); $names[$name] = $index; } $names = array_flip($names); $count = count($names); sort($names); printf("- xml #%d: %s: names (%d): %s\n", $iteration++, $rootName, $count, $names ? implode('; ', $names) : '%'); } XMLSequenceStream::clean(); stream_wrapper_unregister('xmlseq');