rrichards               Mon Sep 29 16:52:03 2008 UTC

  Added files:                 
    /php-src/ext/dom/tests      bug46185.phpt 

  Modified files:              
    /php-src/ext/dom    node.c 
  Log:
  fix bug #46185 (importNode changes the namespace of an XML element)
  add test
  
http://cvs.php.net/viewvc.cgi/php-src/ext/dom/node.c?r1=1.63&r2=1.64&diff_format=u
Index: php-src/ext/dom/node.c
diff -u php-src/ext/dom/node.c:1.63 php-src/ext/dom/node.c:1.64
--- php-src/ext/dom/node.c:1.63 Mon Sep 22 15:09:06 2008
+++ php-src/ext/dom/node.c      Mon Sep 29 16:52:03 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: node.c,v 1.63 2008/09/22 15:09:06 rrichards Exp $ */
+/* $Id: node.c,v 1.64 2008/09/29 16:52:03 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -178,15 +178,29 @@
 
 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);

http://cvs.php.net/viewvc.cgi/php-src/ext/dom/tests/bug46185.phpt?view=markup&rev=1.1
Index: php-src/ext/dom/tests/bug46185.phpt
+++ php-src/ext/dom/tests/bug46185.phpt
--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>


-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to