Bug #66359 [Opn->Csd]: Corrupt implementation of Traversable in DOMNodeList, when created by DOMXPath
| From: | cmb@php.net | Date: | Wed, 28 Nov 2018 17:24:07 +0000 |
| Subject: | Bug #66359 [Opn->Csd]: Corrupt implementation of Traversable in DOMNodeList, when created by DOMXPath | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-218183@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=66359&edit=1
ID: 66359
Updated by: cmb@php.net
Reported by: r dot wilczek at web-appz dot de
Summary: Corrupt implementation of Traversable in
DOMNodeList, when created by DOMXPath
-Status: Open
+Status: Closed
Type: Bug
Package: DOM XML related
Operating System: Linux
PHP Version: 5.5.7
-Assigned To:
+Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
Fixed as of PHP 7.3.0[1]. Closing as duplicate of bug #75451.
[1] <https://3v4l.org/FXAuR>
Previous Comments:
------------------------------------------------------------------------
[2015-03-30 10:20:54] r dot wilczek at web-appz dot de
Is there anybody paying attention to this? I cannot see, why the fact, that DOMXPath and DOMDocument
use different iterators, justifies itself.
------------------------------------------------------------------------
[2014-01-30 20:03:31] r dot wilczek at web-appz dot de
And is that expected behaviour, or would you confirm this as a bug?
------------------------------------------------------------------------
[2014-01-30 16:35:49] jpauli@php.net
DomXpath and DomDocument don't set the node to the same type.
Iterator uses the type to dispatch a different iteration method
(http://lxr.php.net/xref/PHP_5_5/ext/dom/dom_iterators.c#203)
DomDocument iterator creation : http://lxr.php.net/xref/PHP_5_5/ext/dom/php_dom.c#1114
DomXpath iterator creation :
http://lxr.php.net/xref/PHP_5_5/ext/dom/xpath.c#dom_xpath_iter
------------------------------------------------------------------------
[2013-12-27 11:30:01] r dot wilczek at web-appz dot de
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 this bug report at https://bugs.php.net/bug.php?id=66359&edit=1