]> granicus.if.org Git - php/commitdiff
MFH: fix bug #46185 (importNode changes the namespace of an XML element)
authorRob Richards <rrichards@php.net>
Mon, 29 Sep 2008 16:52:45 +0000 (16:52 +0000)
committerRob Richards <rrichards@php.net>
Mon, 29 Sep 2008 16:52:45 +0000 (16:52 +0000)
add test

ext/dom/node.c
ext/dom/tests/bug46185.phpt [new file with mode: 0644]

index 03e64c1897d01ae30a08aec251b40a9d28486133..6363e30f0375e7c80172a1891d0a85312f213dbc 100644 (file)
@@ -178,15 +178,29 @@ const zend_function_entry php_dom_node_class_functions[] = { /* {{{ */
 
 static void dom_reconcile_ns(xmlDocPtr doc, xmlNodePtr nodep) /* {{{ */
 {
-       xmlNsPtr nsptr;
+       xmlNsPtr nsptr, nsdftptr, curns, prevns = NULL;
 
        if (nodep->type == XML_ELEMENT_NODE) {
                /* Following if block primarily used for inserting nodes created via createElementNS */
-               if (nodep->nsDef != NULL && nodep->nsDef->href != NULL) {
-                       if((nsptr = xmlSearchNsByHref(doc, nodep->parent, nodep->nsDef->href)) && 
-                               (nodep->nsDef->prefix == NULL || xmlStrEqual(nsptr->prefix, nodep->nsDef->prefix))) {
-                               dom_set_old_ns(doc, nodep->nsDef);
-                               nodep->nsDef = NULL;
+               if (nodep->nsDef != NULL) {
+                       curns = nodep->nsDef;
+                       while (curns) {
+                               nsdftptr = curns->next;
+                               if (curns->href != NULL) {
+                                       if((nsptr = xmlSearchNsByHref(doc, nodep->parent, curns->href)) && 
+                                               (curns->prefix == NULL || xmlStrEqual(nsptr->prefix, curns->prefix))) {
+                                               curns->next = NULL;
+                                               if (prevns == NULL) {
+                                                       nodep->nsDef = nsdftptr;
+                                               } else {
+                                                       prevns->next = nsdftptr;
+                                               }
+                                               dom_set_old_ns(doc, curns);
+                                               curns = prevns;
+                                       }
+                               }
+                               prevns = curns;
+                               curns = nsdftptr;
                        }
                }
                xmlReconciliateNs(doc, nodep);
diff --git a/ext/dom/tests/bug46185.phpt b/ext/dom/tests/bug46185.phpt
new file mode 100644 (file)
index 0000000..02117cd
--- /dev/null
@@ -0,0 +1,23 @@
+--TEST--
+Bug #46185 (importNode changes the namespace of an XML element).
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php 
+$aDOM = new DOMDocument();
+$aDOM->loadXML('<?xml version="1.0"?>
+<ns1:a xmlns:ns1="urn::ns"/>');
+$a= $aDOM->firstChild;
+
+$ok = new DOMDocument();
+$ok->loadXML('<?xml version="1.0"?>
+<ns1:ok xmlns:ns1="urn::ns" xmlns="urn::REAL"><watch-me xmlns:default="urn::BOGUS"/></ns1:ok>');
+
+$imported= $aDOM->importNode($ok->firstChild, true);
+$a->appendChild($imported);
+
+echo $aDOM->saveXML();
+?>
+--EXPECT--
+<?xml version="1.0"?>
+<ns1:a xmlns:ns1="urn::ns"><ns1:ok xmlns="urn::REAL"><watch-me xmlns:default="urn::BOGUS"/></ns1:ok></ns1:a>
\ No newline at end of file