Bug #66359 [NEW]: Corrupt implementation of Traversable in DOMNodeList, when created by DOMXPath
| From: | r dot wilczek at web-appz dot de | Date: | Fri, 27 Dec 2013 11:30:04 +0000 |
| Subject: | Bug #66359 [NEW]: Corrupt implementation of Traversable in DOMNodeList, when created by DOMXPath | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-183470@lists.php.net to get a copy of this message | ||
From: r dot wilczek at web-appz dot de
Operating system: Linux
PHP version: 5.5.7
Package: DOM XML related
Bug Type: Bug
Bug description:Corrupt implementation of Traversable in DOMNodeList, when created by DOMXPath
Description:
------------
A DOMNodeList created by evaluating a DOMXPath is not correctly
traversable.
Equivalent instances of DOMNodeList created by getElementsByTagName()
etc. do not have this problem.
The example below creates equivalent nodelists and shows the incorrect
iteration of the one created by evaluating an XPath-expression.
Test script:
---------------
function printList(\DOMNodeList $list)
{
foreach ($list as $outer) {
/* @var $outer \DOMNode */
echo 'outer: ' . $outer->nodeValue . PHP_EOL;
foreach ($list as $inner) {
/* @var $inner \DOMNode */
echo ' inner: ' . $inner->nodeValue . PHP_EOL;
}
}
}
/**
* @return DOMNodeList
*/
function getByXpath(\DOMDocument $dom)
{
return (new \DOMXPath($dom))->evaluate('item');
}
/**
* @return DOMNodeList
*/
function getByTagName(\DOMDocument $dom)
{
return $dom->getElementsByTagName('item');
}
$xml = <<< XML
<root>
<item>1</item>
<item>2</item>
<item>3</item>
</root>
XML;
$dom = new \DOMDocument;
$dom->loadXml($xml);
printList(getByTagName($dom));
echo '-------------' . PHP_EOL;
printList(getByXpath($dom));
Expected result:
----------------
outer: 1
inner: 1
inner: 2
inner: 3
outer: 2
inner: 1
inner: 2
inner: 3
outer: 3
inner: 1
inner: 2
inner: 3
-------------
outer: 1
inner: 1
inner: 2
inner: 3
outer: 2
inner: 1
inner: 2
inner: 3
outer: 3
inner: 1
inner: 2
inner: 3
Actual result:
--------------
outer: 1
inner: 1
inner: 2
inner: 3
outer: 2
inner: 1
inner: 2
inner: 3
outer: 3
inner: 1
inner: 2
inner: 3
-------------
outer: 1
inner: 1
inner: 2
inner: 3
--
Edit bug report at https://bugs.php.net/bug.php?id=66359&edit=1
--
Try a snapshot (PHP 5.4): https://bugs.php.net/fix.php?id=66359&r=trysnapshot54
Try a snapshot (PHP 5.5): https://bugs.php.net/fix.php?id=66359&r=trysnapshot55
Try a snapshot (trunk): https://bugs.php.net/fix.php?id=66359&r=trysnapshottrunk
Fixed in SVN: https://bugs.php.net/fix.php?id=66359&r=fixed
Fixed in release: https://bugs.php.net/fix.php?id=66359&r=alreadyfixed
Need backtrace: https://bugs.php.net/fix.php?id=66359&r=needtrace
Need Reproduce Script: https://bugs.php.net/fix.php?id=66359&r=needscript
Try newer version: https://bugs.php.net/fix.php?id=66359&r=oldversion
Not developer issue: https://bugs.php.net/fix.php?id=66359&r=support
Expected behavior: https://bugs.php.net/fix.php?id=66359&r=notwrong
Not enough info: https://bugs.php.net/fix.php?id=66359&r=notenoughinfo
Submitted twice: https://bugs.php.net/fix.php?id=66359&r=submittedtwice
register_globals: https://bugs.php.net/fix.php?id=66359&r=globals
PHP 4 support discontinued: https://bugs.php.net/fix.php?id=66359&r=php4
Daylight Savings: https://bugs.php.net/fix.php?id=66359&r=dst
IIS Stability: https://bugs.php.net/fix.php?id=66359&r=isapi
Install GNU Sed: https://bugs.php.net/fix.php?id=66359&r=gnused
Floating point limitations: https://bugs.php.net/fix.php?id=66359&r=float
No Zend Extensions: https://bugs.php.net/fix.php?id=66359&r=nozend
MySQL Configuration Error: https://bugs.php.net/fix.php?id=66359&r=mysqlcfg