diff --git a/NEWS b/NEWS index 7b3dfb51f3b30..f034b80f3fad1 100644 --- a/NEWS +++ b/NEWS @@ -35,6 +35,10 @@ PHP NEWS . Fixed persistent procedural ODBC connections not getting closed. (NattyNarwhal) +- SimpleXML: + . Fixed bug #52751 (XPath processing-instruction() function is not + supported). (nielsdos) + - SPL: . Fixed bug GH-11972 (RecursiveCallbackFilterIterator regression in 8.1.18). (nielsdos) diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 1e09fa355c73b..7a6719a5737ee 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -1322,7 +1322,7 @@ PHP_METHOD(SimpleXMLElement, xpath) for (i = 0; i < result->nodeNr; ++i) { nodeptr = result->nodeTab[i]; - if (nodeptr->type == XML_TEXT_NODE || nodeptr->type == XML_ELEMENT_NODE || nodeptr->type == XML_ATTRIBUTE_NODE) { + if (nodeptr->type == XML_TEXT_NODE || nodeptr->type == XML_ELEMENT_NODE || nodeptr->type == XML_ATTRIBUTE_NODE || nodeptr->type == XML_PI_NODE) { /** * Detect the case where the last selector is text(), simplexml * always accesses the text() child by default, therefore we assign diff --git a/ext/simplexml/tests/bug52751.phpt b/ext/simplexml/tests/bug52751.phpt new file mode 100644 index 0000000000000..de5d58e9e632a --- /dev/null +++ b/ext/simplexml/tests/bug52751.phpt @@ -0,0 +1,58 @@ +--TEST-- +Bug #52751 (XPath processing-instruction() function is not supported) +--EXTENSIONS-- +simplexml +--FILE-- + + + text node + + + +XML; + +$sxe = simplexml_load_string($xml); + +var_dump( + $sxe->xpath('//bar') +); + +var_dump( + $sxe->xpath('//processing-instruction(\'baz\')') +); + +foreach ($sxe->xpath('//processing-instruction()') as $pi) { + var_dump($pi->getName()); +} + +?> +--EXPECT-- +array(3) { + [0]=> + object(SimpleXMLElement)#2 (1) { + [0]=> + string(9) "text node" + } + [1]=> + object(SimpleXMLElement)#3 (1) { + ["baz"]=> + object(SimpleXMLElement)#5 (0) { + } + } + [2]=> + object(SimpleXMLElement)#4 (1) { + ["foo"]=> + object(SimpleXMLElement)#5 (0) { + } + } +} +array(1) { + [0]=> + object(SimpleXMLElement)#4 (0) { + } +} +string(3) "baz" +string(3) "foo"