You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
xml.dom.Attr.name is not labeled as read-only #57336
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=Nonecreated_at=<Date2011-10-08.04:18:11.489>labels= ['easy', '3.8', 'expert-XML', '3.7', 'library', 'docs']
title='xml.dom.Attr.name is not labeled as read-only'updated_at=<Date2019-07-13.22:51:14.809>user='https://bugs.python.org/dillona'
localName is defined with defproperty() in Lib/xml/dom/minidom.py:464 and looking at the definition of defproperty() in Lib/xml/dom/minicompat.py:97 I think this is supposed to raise an xml.dom.NoModificationAllowedErr exception when someone tries to write on the attribute. This doesn't seem to happen though.
OTOH 'name' doesn't use defproperty(), so technically it's writable, expect that writing on it has no effect.
This should still be documented, and it would also be good to figure out what's going on with defproperty().
The docs are unchanged in 3.2. I presume the behavior is also.
urjitsb87 commented on Dec 3, 2011
urjitsb87mannequin
Mannequin
More actions
Using the same code example as above, I added a simple print statement in the set method being defined in the defproperty and it fired correctly for -
a.childNodes[0].attributes='something'
**My print statement:**in defproperty set for name: attributes
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/urjit/code/mercurial/python/cpython/Lib/xml/dom/minicompat.py", line 106, in set"attempt to modify read-only attribute "+repr(name))
xml.dom.NoModificationAllowedErr: attempt to modify read-only attribute 'attributes'
The getter seems to work fine for localName but the setter somehow does not fire.
I have a fix for this but when I am running the test on my ubuntu vm, it doesnt go beyond test_sndhdr. However, when I run that test directly, it is successful. I can submit a patch if this problem is fixed.
epicfaace commented on Jan 5, 2019
epicfaacemannequin
Mannequin
More actions
This behavior appears to be working as expected per the documentation when using Python 3.7.1. I am able to change name, but changing localName gives me a NoModificationAllowedErr error.
The intended interface seems to be to change .name rather than .localName, so yes, that should be documented somewhere.
The implementation seems a bit funny in that a "self._localName", if set, takes precedence, but there doesn't seem to be an official way to set it. The Attr() constructor even takes a "localname" argument, which it then ignores. o_O
I took a quick look at minidom.py and test_minidom.py. It seems that you should always use doc.renameNode(attr, namespace, new_name) for renaming an attribute (or an element).
When doc.renameNode is applied on an attribute node, it removes the attribute from the ownerElement and re-set it after renaming it.
I agree that this behavior should be documented somewhere.
Maybe there should be a note/warning in the name attribute description. It should says that resetting an attribute name won't change the document representation and that doc.renameNode should be used instead.
Another approach may be to update the name setter implementation to remove and then re-set the attribute in the ownerElement.
What do you think it's the best approach:
update the doc
update the name setter implementation
I'd be happy to help to fix this issue.
potomak commented on Jul 13, 2019
potomakmannequin
Mannequin
More actions
In #14757 I tried updating the implementation of Attr._set_name to remove and reset the attr node in the owner element. So now Attr._set_name behaves similarly to Document.renameNode.
All existing tests are still passing and I added one more test for checking the issue described here.
Activity
dillona commentedon Oct 8, 2011
http://docs.python.org/library/xml.dom.html#dom-attr-objects does not label the name attribute as read-only (like localName) even though it is.
dillona commentedon Oct 8, 2011
The behavior can be verified as follows. Notice that despite changing the value, the output XML does not change
ezio-melotti commentedon Oct 9, 2011
localName is defined with defproperty() in Lib/xml/dom/minidom.py:464 and looking at the definition of defproperty() in Lib/xml/dom/minicompat.py:97 I think this is supposed to raise an xml.dom.NoModificationAllowedErr exception when someone tries to write on the attribute. This doesn't seem to happen though.
OTOH 'name' doesn't use defproperty(), so technically it's writable, expect that writing on it has no effect.
This should still be documented, and it would also be good to figure out what's going on with defproperty().
terryjreedy commentedon Oct 14, 2011
The docs are unchanged in 3.2. I presume the behavior is also.
urjitsb87 commentedon Dec 3, 2011
Using the same code example as above, I added a simple print statement in the set method being defined in the defproperty and it fired correctly for -
The getter seems to work fine for localName but the setter somehow does not fire.
I have a fix for this but when I am running the test on my ubuntu vm, it doesnt go beyond test_sndhdr. However, when I run that test directly, it is successful. I can submit a patch if this problem is fixed.
epicfaace commentedon Jan 5, 2019
This behavior appears to be working as expected per the documentation when using Python 3.7.1. I am able to change name, but changing localName gives me a NoModificationAllowedErr error.
csabella commentedon Apr 14, 2019
Stefan,
Do you think this should be documented?
scoder commentedon Apr 14, 2019
The intended interface seems to be to change .name rather than .localName, so yes, that should be documented somewhere.
The implementation seems a bit funny in that a "self._localName", if set, takes precedence, but there doesn't seem to be an official way to set it. The Attr() constructor even takes a "localname" argument, which it then ignores. o_O
potomak commentedon Jun 26, 2019
I took a quick look at
minidom.pyandtest_minidom.py. It seems that you should always usedoc.renameNode(attr, namespace, new_name)for renaming an attribute (or an element).When
doc.renameNodeis applied on an attribute node, it removes the attribute from theownerElementand re-set it after renaming it.For instance:
I agree that this behavior should be documented somewhere.
Maybe there should be a note/warning in the
nameattribute description. It should says that resetting an attributenamewon't change the document representation and thatdoc.renameNodeshould be used instead.Another approach may be to update the
namesetter implementation to remove and then re-set the attribute in theownerElement.What do you think it's the best approach:
namesetter implementationI'd be happy to help to fix this issue.
potomak commentedon Jul 13, 2019
In #14757 I tried updating the implementation of
Attr._set_nameto remove and reset the attr node in the owner element. So nowAttr._set_namebehaves similarly toDocument.renameNode.All existing tests are still passing and I added one more test for checking the issue described here.
serhiy-storchaka commentedon Dec 26, 2023
I think that it is better to document the limitation, and add a deprecation warning for name setter.
In the DOM model Node attributes are readonly. https://dom.spec.whatwg.org/#interface-node
pythongh-57336: Deprecate setting read-only attributes in xml.dom.min…