DOMXML_GET_OBJ(child, node, le_domxmlnodep);
- if (child->type == XML_ATTRIBUTE_NODE) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't append attribute node");
- RETURN_FALSE;
- }
-
/* XXX:ls */
if (child == parent) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't append node to itself");
}
}
/* end libxml2 code */
+ else if (child->type == XML_ATTRIBUTE_NODE) {
+ if (parent->properties != NULL) {
+ /* Check if an attribute with the same name exists */
+ xmlAttrPtr foundattrp;
+ if (child->ns == NULL)
+ foundattrp = xmlHasProp(parent, child->name);
+ else
+ foundattrp = xmlHasNsProp(parent, child->name, child->ns->href);
+ if ((foundattrp != NULL) && (foundattrp != (xmlAttrPtr) child)) {
+ xmlUnlinkNode((xmlNodePtr) foundattrp);
+ (void)xmlCopyProp(parent, (xmlAttrPtr) child);
+ /* We're in the dark here, what happened to the parent, let's
+ * assume it's handled properly and return the new(?) parent
+ */
+ new_child = parent;
+ }
+ }
+ /* For all other intents and purposes fall through to the xmlAddChild
+ * call
+ */
+ }
+
if (NULL == new_child) {
new_child = xmlAddChild(parent, child);
--- /dev/null
+--TEST--
+Attributes via append_child not supported (bug #23326)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$document = domxml_new_doc('1.0');
+$test = $document->create_element('test');
+$j = 0;
+for($i=0;$i<10;$i++)
+{
+ if( $j < 5 )
+ $j = $i;
+ $test->append_child($document->create_attribute("key$j", $i));
+}
+$document->append_child($test);
+echo $document->dump_mem(1);
+?>
+--EXPECT--
+<?xml version="1.0"?>
+<test key0="0" key1="1" key2="2" key3="3" key4="4" key5="9"/>