diff --git a/NEWS b/NEWS index 1cc265f02e8d..ef5037cc1dc0 100644 --- a/NEWS +++ b/NEWS @@ -114,6 +114,9 @@ PHP NEWS - SimpleXML: . Fixed writing to a dimension of the object returned by attributes() not creating the attribute. (Ilia Alshanetsky) + . Fixed child elements of the element returned by + SimpleXMLElement::addChild() not being accessible by property name when + namespaces are involved. (Ilia Alshanetsky) - Zip: . Fixed bug GH-23276 (ZipArchive subclass storing its own stream cannot be diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 44fdef5e12d7..5a2299dde128 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -1727,7 +1727,8 @@ PHP_METHOD(SimpleXMLElement, addChild) } } - node_as_zval_str(sxe, newnode, return_value, SXE_ITER_NONE, localname, prefix, 0); + node_as_zval_str(sxe, newnode, return_value, SXE_ITER_NONE, localname, + newnode->ns ? newnode->ns->prefix : NULL, 1); xmlFree(localname); if (prefix != NULL) { diff --git a/ext/simplexml/tests/addChild_ns_filter_returned_element.phpt b/ext/simplexml/tests/addChild_ns_filter_returned_element.phpt new file mode 100644 index 000000000000..7627bca7329f --- /dev/null +++ b/ext/simplexml/tests/addChild_ns_filter_returned_element.phpt @@ -0,0 +1,38 @@ +--TEST-- +SimpleXMLElement::addChild() wrong namespace filter on returned element +--EXTENSIONS-- +simplexml +--FILE-- +'); +$c = $x->addChild('a:kid', null, 'http://example.com'); +$c->addChild('inner', 'v'); +echo trim($x->asXML()), "\n"; +echo (string) $c->inner, "\n"; +var_dump(isset($c->inner)); + +$y = new SimpleXMLElement(''); +$d = $y->addChild('kid', null, 'http://example.com'); +$d->addChild('inner', 'w'); +echo trim($y->asXML()), "\n"; +echo (string) $d->inner, "\n"; + +$z = new SimpleXMLElement(''); +$e = $z->addChild('kid'); +$e->addChild('inner', 'z'); +echo trim($z->asXML()), "\n"; +echo (string) $e->inner, "\n"; +var_dump(isset($e->inner)); +?> +--EXPECT-- + +v +v +bool(true) + +w +w + +z +z +bool(true)