feature #19151 [VarDumper] Add support for XmlReader objects (Taluu)
This PR was merged into the 3.2-dev branch.
Discussion
----------
[VarDumper] Add support for XmlReader objects
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | yes
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #18989
| License | MIT
| Doc PR | -
Commits
-------
3779ee4
[VarDumper] Add support for XmlReader objects
This commit is contained in:
commit
9af416d096
@ -73,11 +73,14 @@ class Caster
|
|||||||
* @param array $a The array containing the properties to filter.
|
* @param array $a The array containing the properties to filter.
|
||||||
* @param int $filter A bit field of Caster::EXCLUDE_* constants specifying which properties to filter out.
|
* @param int $filter A bit field of Caster::EXCLUDE_* constants specifying which properties to filter out.
|
||||||
* @param string[] $listedProperties List of properties to exclude when Caster::EXCLUDE_VERBOSE is set, and to preserve when Caster::EXCLUDE_NOT_IMPORTANT is set.
|
* @param string[] $listedProperties List of properties to exclude when Caster::EXCLUDE_VERBOSE is set, and to preserve when Caster::EXCLUDE_NOT_IMPORTANT is set.
|
||||||
|
* @param int &$count Set to the number of removed properties.
|
||||||
*
|
*
|
||||||
* @return array The filtered array
|
* @return array The filtered array
|
||||||
*/
|
*/
|
||||||
public static function filter(array $a, $filter, array $listedProperties = array())
|
public static function filter(array $a, $filter, array $listedProperties = array(), &$count = 0)
|
||||||
{
|
{
|
||||||
|
$count = 0;
|
||||||
|
|
||||||
foreach ($a as $k => $v) {
|
foreach ($a as $k => $v) {
|
||||||
$type = self::EXCLUDE_STRICT & $filter;
|
$type = self::EXCLUDE_STRICT & $filter;
|
||||||
|
|
||||||
@ -108,6 +111,7 @@ class Caster
|
|||||||
|
|
||||||
if ((self::EXCLUDE_STRICT & $filter) ? $type === $filter : $type) {
|
if ((self::EXCLUDE_STRICT & $filter) ? $type === $filter : $type) {
|
||||||
unset($a[$k]);
|
unset($a[$k]);
|
||||||
|
++$count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ class StubCaster
|
|||||||
$stub->class = '';
|
$stub->class = '';
|
||||||
$stub->handle = 0;
|
$stub->handle = 0;
|
||||||
$stub->value = null;
|
$stub->value = null;
|
||||||
|
$stub->cut = $c->cut;
|
||||||
|
|
||||||
$a = array();
|
$a = array();
|
||||||
|
|
||||||
|
77
src/Symfony/Component/VarDumper/Caster/XmlReaderCaster.php
Normal file
77
src/Symfony/Component/VarDumper/Caster/XmlReaderCaster.php
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\VarDumper\Caster;
|
||||||
|
|
||||||
|
use Symfony\Component\VarDumper\Cloner\Stub;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Casts XmlReader class to array representation.
|
||||||
|
*
|
||||||
|
* @author Baptiste Clavié <clavie.b@gmail.com>
|
||||||
|
*/
|
||||||
|
class XmlReaderCaster
|
||||||
|
{
|
||||||
|
private static $nodeTypes = array(
|
||||||
|
\XmlReader::NONE => 'NONE',
|
||||||
|
\XmlReader::ELEMENT => 'ELEMENT',
|
||||||
|
\XmlReader::ATTRIBUTE => 'ATTRIBUTE',
|
||||||
|
\XmlReader::TEXT => 'TEXT',
|
||||||
|
\XmlReader::CDATA => 'CDATA',
|
||||||
|
\XmlReader::ENTITY_REF => 'ENTITY_REF',
|
||||||
|
\XmlReader::ENTITY => 'ENTITY',
|
||||||
|
\XmlReader::PI => 'PI (Processing Instruction)',
|
||||||
|
\XmlReader::COMMENT => 'COMMENT',
|
||||||
|
\XmlReader::DOC => 'DOC',
|
||||||
|
\XmlReader::DOC_TYPE => 'DOC_TYPE',
|
||||||
|
\XmlReader::DOC_FRAGMENT => 'DOC_FRAGMENT',
|
||||||
|
\XmlReader::NOTATION => 'NOTATION',
|
||||||
|
\XmlReader::WHITESPACE => 'WHITESPACE',
|
||||||
|
\XmlReader::SIGNIFICANT_WHITESPACE => 'SIGNIFICANT_WHITESPACE',
|
||||||
|
\XmlReader::END_ELEMENT => 'END_ELEMENT',
|
||||||
|
\XmlReader::END_ENTITY => 'END_ENTITY',
|
||||||
|
\XmlReader::XML_DECLARATION => 'XML_DECLARATION',
|
||||||
|
);
|
||||||
|
|
||||||
|
public static function castXmlReader(\XmlReader $reader, array $a, Stub $stub, $isNested)
|
||||||
|
{
|
||||||
|
$props = Caster::PREFIX_VIRTUAL.'parserProperties';
|
||||||
|
$info = array(
|
||||||
|
'localName' => $reader->localName,
|
||||||
|
'prefix' => $reader->prefix,
|
||||||
|
'nodeType' => new ConstStub(self::$nodeTypes[$reader->nodeType], $reader->nodeType),
|
||||||
|
'depth' => $reader->depth,
|
||||||
|
'isDefault' => $reader->isDefault,
|
||||||
|
'isEmptyElement' => \XmlReader::NONE === $reader->nodeType ? null : $reader->isEmptyElement,
|
||||||
|
'xmlLang' => $reader->xmlLang,
|
||||||
|
'attributeCount' => $reader->attributeCount,
|
||||||
|
'value' => $reader->value,
|
||||||
|
'namespaceURI' => $reader->namespaceURI,
|
||||||
|
'baseURI' => $reader->baseURI,
|
||||||
|
$props => array(
|
||||||
|
'LOADDTD' => $reader->getParserProperty(\XmlReader::LOADDTD),
|
||||||
|
'DEFAULTATTRS' => $reader->getParserProperty(\XmlReader::DEFAULTATTRS),
|
||||||
|
'VALIDATE' => $reader->getParserProperty(\XmlReader::VALIDATE),
|
||||||
|
'SUBST_ENTITIES' => $reader->getParserProperty(\XmlReader::SUBST_ENTITIES),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($info[$props] = Caster::filter($info[$props], Caster::EXCLUDE_EMPTY, array(), $count)) {
|
||||||
|
$info[$props] = new EnumStub($info[$props]);
|
||||||
|
$info[$props]->cut = $count;
|
||||||
|
}
|
||||||
|
|
||||||
|
$info = Caster::filter($info, Caster::EXCLUDE_EMPTY, array(), $count);
|
||||||
|
// +2 because hasValue and hasAttributes are always filtered
|
||||||
|
$stub->cut += $count + 2;
|
||||||
|
|
||||||
|
return $a + $info;
|
||||||
|
}
|
||||||
|
}
|
@ -67,6 +67,8 @@ abstract class AbstractCloner implements ClonerInterface
|
|||||||
'DOMProcessingInstruction' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castProcessingInstruction',
|
'DOMProcessingInstruction' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castProcessingInstruction',
|
||||||
'DOMXPath' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castXPath',
|
'DOMXPath' => 'Symfony\Component\VarDumper\Caster\DOMCaster::castXPath',
|
||||||
|
|
||||||
|
'XmlReader' => 'Symfony\Component\VarDumper\Caster\XmlReaderCaster::castXmlReader',
|
||||||
|
|
||||||
'ErrorException' => 'Symfony\Component\VarDumper\Caster\ExceptionCaster::castErrorException',
|
'ErrorException' => 'Symfony\Component\VarDumper\Caster\ExceptionCaster::castErrorException',
|
||||||
'Exception' => 'Symfony\Component\VarDumper\Caster\ExceptionCaster::castException',
|
'Exception' => 'Symfony\Component\VarDumper\Caster\ExceptionCaster::castException',
|
||||||
'Error' => 'Symfony\Component\VarDumper\Caster\ExceptionCaster::castError',
|
'Error' => 'Symfony\Component\VarDumper\Caster\ExceptionCaster::castError',
|
||||||
|
@ -0,0 +1,247 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\VarDumper\Tests\Caster;
|
||||||
|
|
||||||
|
use Symfony\Component\VarDumper\Test\VarDumperTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Baptiste Clavié <clavie.b@gmail.com>
|
||||||
|
*/
|
||||||
|
class XmlReaderCasterTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
use VarDumperTestTrait;
|
||||||
|
|
||||||
|
/** @var \XmlReader */
|
||||||
|
private $reader;
|
||||||
|
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
$this->reader = new \XmlReader();
|
||||||
|
$this->reader->open(__DIR__.'/../Fixtures/xml_reader.xml');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function tearDown()
|
||||||
|
{
|
||||||
|
$this->reader->close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testParserProperty()
|
||||||
|
{
|
||||||
|
$this->reader->setParserProperty(\XMLReader::SUBST_ENTITIES, true);
|
||||||
|
|
||||||
|
$expectedDump = <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+nodeType: NONE
|
||||||
|
parserProperties: {
|
||||||
|
SUBST_ENTITIES: true
|
||||||
|
…3
|
||||||
|
}
|
||||||
|
…12
|
||||||
|
}
|
||||||
|
EODUMP;
|
||||||
|
|
||||||
|
$this->assertDumpMatchesFormat($expectedDump, $this->reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideNodes
|
||||||
|
*/
|
||||||
|
public function testNodes($seek, $expectedDump)
|
||||||
|
{
|
||||||
|
while ($seek--) {
|
||||||
|
$this->reader->read();
|
||||||
|
}
|
||||||
|
$this->assertDumpMatchesFormat($expectedDump, $this->reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideNodes()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array(0, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+nodeType: NONE
|
||||||
|
…13
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(1, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "foo"
|
||||||
|
+nodeType: ELEMENT
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…11
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(2, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "#text"
|
||||||
|
+nodeType: SIGNIFICANT_WHITESPACE
|
||||||
|
+depth: 1
|
||||||
|
+value: """
|
||||||
|
\n
|
||||||
|
|
||||||
|
"""
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…9
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(3, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "bar"
|
||||||
|
+nodeType: ELEMENT
|
||||||
|
+depth: 1
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…10
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(4, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "bar"
|
||||||
|
+nodeType: END_ELEMENT
|
||||||
|
+depth: 1
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…10
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(6, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "bar"
|
||||||
|
+nodeType: ELEMENT
|
||||||
|
+depth: 1
|
||||||
|
+isEmptyElement: true
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…9
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(9, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "#text"
|
||||||
|
+nodeType: TEXT
|
||||||
|
+depth: 2
|
||||||
|
+value: "With text"
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…9
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(12, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "bar"
|
||||||
|
+nodeType: ELEMENT
|
||||||
|
+depth: 1
|
||||||
|
+attributeCount: 2
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…9
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(13, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "bar"
|
||||||
|
+nodeType: END_ELEMENT
|
||||||
|
+depth: 1
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…10
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(15, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "bar"
|
||||||
|
+nodeType: ELEMENT
|
||||||
|
+depth: 1
|
||||||
|
+attributeCount: 1
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…9
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(16, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "#text"
|
||||||
|
+nodeType: SIGNIFICANT_WHITESPACE
|
||||||
|
+depth: 2
|
||||||
|
+value: """
|
||||||
|
\n
|
||||||
|
|
||||||
|
"""
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…9
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(17, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "baz"
|
||||||
|
+prefix: "baz"
|
||||||
|
+nodeType: ELEMENT
|
||||||
|
+depth: 2
|
||||||
|
+namespaceURI: "http://symfony.com"
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…8
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(18, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "baz"
|
||||||
|
+prefix: "baz"
|
||||||
|
+nodeType: END_ELEMENT
|
||||||
|
+depth: 2
|
||||||
|
+namespaceURI: "http://symfony.com"
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…8
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(19, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "#text"
|
||||||
|
+nodeType: SIGNIFICANT_WHITESPACE
|
||||||
|
+depth: 2
|
||||||
|
+value: """
|
||||||
|
\n
|
||||||
|
|
||||||
|
"""
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…9
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(21, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "#text"
|
||||||
|
+nodeType: SIGNIFICANT_WHITESPACE
|
||||||
|
+depth: 1
|
||||||
|
+value: "\n"
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…9
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
array(22, <<<'EODUMP'
|
||||||
|
XMLReader {
|
||||||
|
+localName: "foo"
|
||||||
|
+nodeType: END_ELEMENT
|
||||||
|
+baseURI: "%sxml_reader.xml"
|
||||||
|
…11
|
||||||
|
}
|
||||||
|
EODUMP
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<foo>
|
||||||
|
<bar></bar>
|
||||||
|
<bar />
|
||||||
|
<bar>With text</bar>
|
||||||
|
<bar foo="bar" baz="fubar"></bar>
|
||||||
|
<bar xmlns:baz="http://symfony.com">
|
||||||
|
<baz:baz></baz:baz>
|
||||||
|
</bar>
|
||||||
|
</foo>
|
Reference in New Issue
Block a user