diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 57c0627d61a6..044daac6dd0b 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 || nodeptr->type == XML_PI_NODE) { + if (nodeptr->type == XML_TEXT_NODE || nodeptr->type == XML_ELEMENT_NODE || nodeptr->type == XML_ATTRIBUTE_NODE || nodeptr->type == XML_PI_NODE || nodeptr->type == XML_COMMENT_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/bug12170.phpt b/ext/simplexml/tests/bug12170.phpt new file mode 100644 index 000000000000..c1535fe7640f --- /dev/null +++ b/ext/simplexml/tests/bug12170.phpt @@ -0,0 +1,52 @@ +--TEST-- +Bug GH-12170 (Can't use xpath with comments in SimpleXML) +--EXTENSIONS-- +simplexml +--FILE-- + + + text node + + + +XML; + +$sxe = simplexml_load_string($xml); + +var_dump( + $sxe->xpath('//bar') +); + +foreach ($sxe->xpath('//comment()') as $comment) { + var_dump($comment->getName()); + var_dump($comment->asXML()); +} + +?> +--EXPECT-- +array(3) { + [0]=> + object(SimpleXMLElement)#2 (1) { + [0]=> + string(9) "text node" + } + [1]=> + object(SimpleXMLElement)#3 (1) { + ["comment"]=> + object(SimpleXMLElement)#5 (0) { + } + } + [2]=> + object(SimpleXMLElement)#4 (1) { + ["comment"]=> + object(SimpleXMLElement)#5 (0) { + } + } +} +string(7) "comment" +string(12) "" +string(7) "comment" +string(12) ""