private function writeReaderImpl(XMLWriter $writer, XMLReader $reader)
 {
     switch ($reader->nodeType) {
         case XMLReader::ELEMENT:
             $writer->startElement($reader->name);
             if ($reader->moveToFirstAttribute()) {
                 do {
                     $writer->writeAttribute($reader->name, $reader->value);
                 } while ($reader->moveToNextAttribute());
                 $reader->moveToElement();
             }
             if ($reader->isEmptyElement) {
                 $writer->endElement();
             }
             break;
         case XMLReader::END_ELEMENT:
             $writer->endElement();
             break;
         case XMLReader::COMMENT:
             $writer->writeComment($reader->value);
             break;
         case XMLReader::SIGNIFICANT_WHITESPACE:
         case XMLReader::TEXT:
             $writer->text($reader->value);
             break;
         case XMLReader::PI:
             $writer->writePi($reader->name, $reader->value);
             break;
         default:
             XMLReaderNode::dump($reader);
     }
 }
 /**
  * @test
  * @dataProvider provideAllFiles
  *
  * @param string $xml
  */
 function nextBehavior($xml)
 {
     $reader = new XMLReaderStub($xml);
     $it = new XMLReaderNextIteration($reader);
     $expected = array();
     while ($reader->next()) {
         $expected[] = XMLReaderNode::dump($reader, true);
     }
     $reader->rewind();
     $index = 0;
     foreach ($it as $index => $node) {
         $this->assertEquals($expected[$index], XMLReaderNode::dump($reader, true));
     }
     $this->assertCount($index + 1, $expected);
 }
/*
 * This file is part of the XMLReaderIterator package.
 *
 * Copyright (C) 2014 hakre <http://hakre.wordpress.com>
 *
 * Example: XML Reader standard iteration
 */
require 'xmlreader-iterators.php';
// require XMLReaderIterator library
$xml = <<<XML
<movies>
    <movie>
        <title>PHP: Behind the Parser</title>
    </movie>
    <movie>
        <title>Whitespace</title>
    </movie>
    <movie>
        <title>Whitespace - Tabs Revenge</title>
    </movie>
    <movie>
        <title>Whitespace - The Return of the Whitespace</title>
    </movie>
</movies>
XML;
$reader = new XMLReader();
$reader->open('data://text/plain,' . urlencode($xml));
while ($reader->read()) {
    XMLReaderNode::dump($reader);
}
 private function build()
 {
     if (!$this->valid()) {
         $this->depth = NULL;
         $this->lastDetpth = NULL;
         $this->node = NULL;
         $this->lastNode = NULL;
         $this->stack = NULL;
         return;
     }
     $depth = $this->reader->depth;
     switch ($this->reader->nodeType) {
         case XMLReader::ELEMENT:
             $parent = $this->stack[$depth];
             $prefix = $this->reader->prefix;
             /* @var $node DOMElement */
             if ($prefix) {
                 $uri = $parent->lookupNamespaceURI($prefix) ?: $this->nsUriSelfLookup($prefix);
                 if ($uri === NULL) {
                     trigger_error(sprintf('Unable to lookup NS URI for element prefix "%s"', $prefix));
                 }
                 /* @var $doc DOMDocument */
                 $doc = $parent->ownerDocument ?: $parent;
                 $node = $doc->createElementNS($uri, $this->reader->name);
                 $node = $parent->appendChild($node);
             } else {
                 $node = $parent->appendChild(new DOMElement($this->reader->name));
             }
             $this->stack[$depth + 1] = $node;
             if ($this->reader->moveToFirstAttribute()) {
                 $nsUris = array();
                 do {
                     if ($this->reader->prefix === 'xmlns') {
                         $nsUris[$this->reader->localName] = $this->reader->value;
                     }
                 } while ($this->reader->moveToNextAttribute());
                 $this->reader->moveToFirstAttribute();
                 do {
                     $prefix = $this->reader->prefix;
                     if ($prefix === 'xmlns') {
                         $node->setAttributeNS('http://www.w3.org/2000/xmlns/', $this->reader->name, $this->reader->value);
                     } elseif ($prefix) {
                         $uri = $parent->lookupNamespaceUri($prefix) ?: @$nsUris[$prefix];
                         if ($uri === NULL) {
                             trigger_error(sprintf('Unable to lookup NS URI for attribute prefix "%s"', $prefix));
                         }
                         $node->setAttributeNS($uri, $this->reader->name, $this->reader->value);
                     } else {
                         $node->appendChild(new DOMAttr($this->reader->name, $this->reader->value));
                     }
                 } while ($this->reader->moveToNextAttribute());
             }
             break;
         case XMLReader::END_ELEMENT:
             $node = NULL;
             break;
         case XMLReader::COMMENT:
             $node = $this->stack[$depth]->appendChild(new DOMComment($this->reader->value));
             break;
         case XMLReader::SIGNIFICANT_WHITESPACE:
         case XMLReader::TEXT:
         case XMLReader::WHITESPACE:
             $node = $this->stack[$depth]->appendChild(new DOMText($this->reader->value));
             break;
         case XMLReader::PI:
             $node = $this->stack[$depth]->appendChild(new DOMProcessingInstruction($this->reader->name, $this->reader->value));
             break;
         default:
             $node = NULL;
             $message = sprintf('Unhandeled XMLReader node type %s', XMLReaderNode::dump($this->reader, TRUE));
             trigger_error($message);
     }
     $this->depth = $depth;
     $this->node = $node;
 }