Bug #66359 [Com]: Corrupt implementation of Traversable in DOMNodeList, when created by DOMXPath

From: Date: Thu, 30 Jan 2014 20:03:32 +0000
Subject: Bug #66359 [Com]: Corrupt implementation of Traversable in DOMNodeList, when created by DOMXPath
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-184094@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 Comment by: r dot wilczek at web-appz dot de Reported by: r dot wilczek at web-appz dot de Summary: Corrupt implementation of Traversable in DOMNodeList, when created by DOMXPath Status: Open Type: Bug Package: DOM XML related Operating System: Linux PHP Version: 5.5.7 Block user comment: N Private report: N New Comment: And is that expected behaviour, or would you confirm this as a bug? Previous Comments: ------------------------------------------------------------------------ [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 (#184094) next »