SKIP_TEXT(node);
} else {
if (node->type == XML_TEXT_NODE) {
- xmlChar *tmp;
-
- MAKE_STD_ZVAL(value);
- tmp = xmlNodeListGetString(node->doc, node, 1);
- ZVAL_XML_STRING(value, (char *)tmp, ZSTR_DUPLICATE);
- xmlFree(tmp);
- zend_hash_next_index_insert(rv, &value, sizeof(zval *), NULL);
+ const xmlChar *cur = node->content;
+
+ if (*cur != 0) {
+ xmlChar *tmp;
+
+ MAKE_STD_ZVAL(value);
+ tmp = xmlNodeListGetString(node->doc, node, 1);
+ ZVAL_XML_STRING(value, (char *)tmp, ZSTR_DUPLICATE);
+ xmlFree(tmp);
+ zend_hash_next_index_insert(rv, &value, sizeof(zval *), NULL);
+ }
goto next_iter;
}
}
--- /dev/null
+--TEST--
+Bug #46047 (SimpleXML converts empty nodes into object with nested array)
+--FILE--
+<?php
+$xml = new SimpleXMLElement('<foo><bar><![CDATA[]]></bar><baz/></foo>',
+ LIBXML_NOCDATA);
+print_r($xml);
+
+$xml = new SimpleXMLElement('<foo><bar></bar><baz/></foo>');
+print_r($xml);
+
+$xml = new SimpleXMLElement('<foo><bar/><baz/></foo>');
+print_r($xml);
+?>
+--EXPECTF--
+SimpleXMLElement Object
+(
+ [bar] => SimpleXMLElement Object
+ (
+ )
+
+ [baz] => SimpleXMLElement Object
+ (
+ )
+
+)
+SimpleXMLElement Object
+(
+ [bar] => SimpleXMLElement Object
+ (
+ )
+
+ [baz] => SimpleXMLElement Object
+ (
+ )
+
+)
+SimpleXMLElement Object
+(
+ [bar] => SimpleXMLElement Object
+ (
+ )
+
+ [baz] => SimpleXMLElement Object
+ (
+ )
+
+)
\ No newline at end of file