Bug #66359 [Opn->Csd]: Corrupt implementation of Traversable in DOMNodeList, when created by DOMXPath

From: 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

« previous php.bugs (#218183) next »