Bug #75779 [Opn->Csd]: DOMElement#setAttribute() does not process prefixed namespace declarations

From: Date: Sat, 09 Mar 2024 16:09:51 +0000
Subject: Bug #75779 [Opn->Csd]: DOMElement#setAttribute() does not process prefixed namespace declarations
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-246552@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=75779&edit=1

 ID:                 75779
 Updated by:         nielsdos@php.net
 Reported by:        daverandom@php.net
 Summary:            DOMElement#setAttribute() does not process prefixed
                     namespace declarations
-Status:             Open
+Status:             Closed
 Type:               Bug
 Package:            DOM XML related
 Operating System:   Any
 PHP Version:        7.1.13
-Assigned To:        
+Assigned To:        nielsdos
 Block user comment: N
 Private report:     N

 New Comment:

The fix for this bug has been committed.
If you are still experiencing this bug, try to check out latest source from https://github.com/php/php-src and re-test.
Thank you for the report, and for helping us make PHP better.




Previous Comments:
------------------------------------------------------------------------
[2024-03-09 16:09:15] nielsdos@php.net

This is fixed in the new opt-in spec-compliance mode, which was merged in https://github.com/php/php-src/pull/13031.
For more information about the opt-in mode, please see https://wiki.php.net/rfc/opt_in_dom_spec_compliance.
In short: the behaviour of the old DOM classes are unaffected for backwards-compatibility reasons.
There are new DOM classes where your code is correctly handled.
This feature will be available in PHP 8.4.

------------------------------------------------------------------------
[2018-01-08 16:33:01] daverandom@php.net

Description:
------------
DOMElement#setAttribute() correctly handles setting the default (unprefixed) namespace, but does not
handle prefixed namespaces, and simply creates a DOMAttr and appends it to the node.

Test script:
---------------
$xml = '<?xml version="1.0" ?><test />';
$doc = new DOMDocument();
$doc->loadXML($xml);

$element = $doc->documentElement;

// Unprefixed works fine

echo "\nElement should not have namespace:\n";
var_dump($element->lookupPrefix('test:unprefixed'),
$element->lookupNamespaceURI(null));

echo "\nsetAttribute() call should succeed:\n";
var_dump($element->setAttribute('xmlns', 'test:unprefixed'));

echo "\nElement should have xmlns attribute:\n";
var_dump($element->hasAttribute('xmlns'));

echo "\nElement should have namespace:\n";
var_dump($element->lookupPrefix('test:unprefixed'),
$element->lookupNamespaceURI(null));

// Prefixed does not work

echo "\nElement should not have namespace:\n";
var_dump($element->lookupPrefix('test:prefixed'),
$element->lookupNamespaceURI('test'));

echo "\nsetAttribute() call should succeed:\n";
var_dump($element->setAttribute('xmlns:test', 'test:prefixed'));

echo "\nElement should have xmlns attribute:\n";
var_dump($element->hasAttribute('xmlns:test'));

echo "\nElement should have namespace:\n";
var_dump($element->lookupPrefix('test:prefixed'),
$element->lookupNamespaceURI('test'));


Expected result:
----------------
Namespace is registered with prefix

Actual result:
--------------
DOMAttr is added to node but namespace is not registered


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=75779&edit=1


Thread (3 messages)

« previous php.bugs (#246552) next »