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); } }
private function initializeFrom(XMLReader $reader) { if ($reader->nodeType !== XMLReader::ELEMENT) { $node = new XMLReaderNode($reader); throw new RuntimeException(sprintf('Reader must be at an XMLReader::ELEMENT, is XMLReader::%s given.', $node->getNodeTypeName())); } $this->name_ = $reader->name; $this->attributes_ = parent::getAttributes()->getArrayCopy(); }
/** * some XMLReaderNode can not be turned into a SimpleXMLElement, this tests how robust XMLReaderNode * is for the job. * * @test */ function asSimpleXMLforElementAndSignificantWhitespace() { $reader = new XMLReaderStub('<root> <!-- <3 <3 love XMLReader::SIGNIFICANT_WHITESPACE (14) <3 <3 --> </root>'); $reader->read(); // (#1) <root> // test asSimpleXML() for XMLReader::ELEMENT $this->assertSame(XMLReader::ELEMENT, $reader->nodeType); $node = new XMLReaderNode($reader); $sxml = $node->getSimpleXMLElement(); $this->assertInstanceOf('SimpleXMLElement', $sxml); $reader->read(); // (#14) SIGNIFICANT_WHITESPACE // test asSimpleXML() for XMLReader::SIGNIFICANT_WHITESPACE $this->assertSame(XMLReader::SIGNIFICANT_WHITESPACE, $reader->nodeType); $node = new XMLReaderNode($reader); $sxml = $node->getSimpleXMLElement(); $this->assertNull($sxml); }
/** * @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); }
/** * @return array */ public function toArray() { $array = array(); $this->didRewind || $this->rewind(); if (!$this->valid()) { return array(); } $this->ensureCurrentElementState(); while ($this->valid()) { $element = new XMLReaderNode($this->reader); if ($this->reader->hasValue) { $string = $this->reader->value; } else { $string = $element->readString(); } if ($this->name) { $array[] = $string; } else { $array[$element->name] = $string; } $this->moveToNextElementByName($this->name); } return $array; }
/** * @param XMLReader $reader * * @return string */ public static function readerNode(XMLReader $reader) { switch ($reader->nodeType) { case XMLREADER::NONE: return '%(0)%'; case XMLReader::ELEMENT: return XMLBuild::startTag($reader->name, new XMLAttributeIterator($reader)); default: $node = new XMLReaderNode($reader); $nodeTypeName = $node->getNodeTypeName(); $nodeType = $reader->nodeType; return sprintf('%%%s (%d)%%', $nodeTypeName, $nodeType); } }
/* * 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; }