|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2014-01-30 16:35 UTC] jpauli@php.net
[2014-01-30 20:03 UTC] r dot wilczek at web-appz dot de
[2015-03-30 10:20 UTC] r dot wilczek at web-appz dot de
[2018-11-28 17:24 UTC] cmb@php.net
-Status: Open
+Status: Closed
-Assigned To:
+Assigned To: cmb
[2018-11-28 17:24 UTC] cmb@php.net
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 05:00:01 2025 UTC |
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