Bug #55294 [Csd->ReO]: DOMDocument::importNode shifts namespaces when "default" namespace exists
Edit report at https://bugs.php.net/bug.php?id=55294&edit=1
ID: 55294
Updated by: nielsdos@php.net
Reported by: hilse at web dot de
Summary: DOMDocument::importNode shifts namespaces when
"default" namespace exists
-Status: Closed
+Status: Re-Opened
Type: Bug
Package: DOM XML related
Operating System: Linux
PHP Version: trunk-SVN-2011-07-27 (snap)
Block user comment: N
Private report: N
New Comment:
Had to revert the fix unfortunately because some applications are dependent on a particular
serialization. See https://github.com/php/php-src/pull/12308
I'm planning to work on spec-compliance related issues in the near future (in an opt-in
manner), so I will consider this issue as a part of that effort.
Previous Comments:
------------------------------------------------------------------------
[2023-06-15 19:58:09] git@php.net
Automatic comment on behalf of nielsdos
Revision: https://github.com/php/php-src/commit/b30be40b86b62fc681c432fd96840d8e57e172a5
Log: Fix bug #55294 and #47530 and #47847: namespace reconciliation issues
------------------------------------------------------------------------
[2013-12-03 07:45:58] mike@php.net
Related To: Bug #47530
------------------------------------------------------------------------
[2013-12-02 19:40:54] mike@php.net
If, then an upstream bug of libxml2.
xmlNewReconciliedNS() uses "default" as prefix if not already found in the doc.
So either don't use default, or looking at libxml2 sources, default followed by a number in the
range 0-1000, or file a bug at http://bugzilla.gnome.org/buglist.cgi?product=libxml2
And on a side note: it happens on append not import.
------------------------------------------------------------------------
[2011-07-27 12:35:16] hilse at web dot de
Description:
------------
When importing nodes and their children via DOMDocument::importNode, the method
will introduce the "default" namespace prefix. Herein lies a bug that will trigger
if the namespace prefix "default" is already assigned (even if not applied to any
element) within the children of the imported node.
Test script:
---------------
<?php
$aDOM=DOMDocument::loadXML(<<<EOXML
<A xmlns="http://example.hilses.de/A">
<B>
<C
xmlns="http://example.hilses.de/C"
xmlns:default="http://example.hilses.de/Z" />
</B>
</A>
EOXML
);
$bDOM=new DOMDocument();
$node = $bDOM->importNode($aDOM->getElementsByTagNameNS('http://example.hilses.de/A','B')->item(0),
true);
$bDOM->appendChild($node);
echo $bDOM->saveXML()."\n";
?>
Expected result:
----------------
<?xml version="1.0"?>
<B xmlns="http://example.hilses.de/A"
xmlns:default="http://example.hilses.de/C">
<default:C />
</B>
or even better:
<?xml version="1.0"?>
<B xmlns="http://example.hilses.de/A">
<C xmlns="http://example.hilses.de/C"/>
</B>
Actual result:
--------------
<?xml version="1.0"?>
<B xmlns="http://example.hilses.de/A"
xmlns:default="http://example.hilses.de/C">
<default:C xmlns="http://example.hilses.de/C"
xmlns:default="http://example.hilses.de/Z"/>
</B>
(see how C is put into the ".../Z" namespace now instead of ".../C", since
namespace prefix declarations are valid for the element in which they are
defined!)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=55294&edit=1
Thread (5 messages)