[issue13127] xml.dom.Attr.name is not labeled as read-only

New submission from Dillon Amburgey <dillona@dillona.com>: 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. ---------- assignee: docs@python components: Documentation messages: 145155 nosy: dillona, docs@python priority: normal severity: normal status: open title: xml.dom.Attr.name is not labeled as read-only _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue13127> _______________________________________

Dillon Amburgey <dillona@dillona.com> added the comment: The behavior can be verified as follows. Notice that despite changing the value, the output XML does not change
from xml.dom import minidom, Node a = minidom.parseString("<a href=\"http://asd.com\">asd</a>") a <xml.dom.minidom.Document instance at 0x22d7c68> a.childNodes [<DOM Element: a at 0x22d7d88>] a.childNodes[0] <DOM Element: a at 0x22d7d88> a.childNodes[0].attributes <xml.dom.minidom.NamedNodeMap object at 0x21caa70> a.childNodes[0].attributes.item(0) <xml.dom.minidom.Attr instance at 0x22d7f38> a.childNodes[0].attributes.item(0).name u'href' attr = a.childNodes[0].attributes.item(0) attr.name = "ad" a.toxml() u'<?xml version="1.0" ?><a href="http://asd.com">asd</a>' attr.value = "asd" a.toxml() u'<?xml version="1.0" ?><a href="asd">asd</a>'
---------- _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue13127> _______________________________________

Ezio Melotti <ezio.melotti@gmail.com> added the comment: 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(). ---------- components: +Library (Lib) keywords: +easy nosy: +ezio.melotti stage: -> test needed versions: +Python 2.7 _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue13127> _______________________________________

Terry J. Reedy <tjreedy@udel.edu> added the comment: The docs are unchanged in 3.2. I presume the behavior is also. ---------- nosy: +terry.reedy versions: +Python 3.2, Python 3.3 _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue13127> _______________________________________

Urjit Bhatia <urjitsb87@gmail.com> added the comment: 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. ---------- nosy: +urjitsb87 _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue13127> _______________________________________

Ashwin Ramaswami <aramaswamis@gmail.com> added the comment: 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. ---------- nosy: +Ashwin Ramaswami versions: +Python 3.7 -Python 2.7, Python 3.2, Python 3.3 _______________________________________ Python tracker <report@bugs.python.org> <https://bugs.python.org/issue13127> _______________________________________

Cheryl Sabella <cheryl.sabella@gmail.com> added the comment: Stefan, Do you think this should be documented? ---------- nosy: +cheryl.sabella, scoder _______________________________________ Python tracker <report@bugs.python.org> <https://bugs.python.org/issue13127> _______________________________________

Stefan Behnel <stefan_ml@behnel.de> added the comment: 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 ---------- components: +XML stage: test needed -> needs patch versions: +Python 3.8 _______________________________________ Python tracker <report@bugs.python.org> <https://bugs.python.org/issue13127> _______________________________________

Giovanni Cappellotto <potomak84@gmail.com> added the comment: 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. For instance: ```
import xml.dom.minidom from xml.dom import minidom doc = minidom.parseString("<a href=\"http://foo.com\">foo</a>") attr = doc.childNodes[0].attributes.item(0) doc.renameNode(attr, xml.dom.EMPTY_NAMESPACE, "bar") <xml.dom.minidom.Attr object at 0x7fb27d7ddb00> doc.toxml() '<?xml version="1.0" ?><a bar="http://foo.com">foo</a>'
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:
1. update the doc
2. update the `name` setter implementation
I'd be happy to help to fix this issue.
----------
nosy: +potomak
_______________________________________
Python tracker <report@bugs.python.org>
<https://bugs.python.org/issue13127>
_______________________________________

Change by Giovanni Cappellotto <potomak84@gmail.com>: ---------- keywords: +patch pull_requests: +14552 stage: needs patch -> patch review pull_request: https://github.com/python/cpython/pull/14757 _______________________________________ Python tracker <report@bugs.python.org> <https://bugs.python.org/issue13127> _______________________________________

Giovanni Cappellotto <potomak84@gmail.com> added the comment: In https://github.com/python/cpython/pull/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. ---------- _______________________________________ Python tracker <report@bugs.python.org> <https://bugs.python.org/issue13127> _______________________________________
participants (8)
-
Ashwin Ramaswami
-
Cheryl Sabella
-
Dillon Amburgey
-
Ezio Melotti
-
Giovanni Cappellotto
-
Stefan Behnel
-
Terry J. Reedy
-
Urjit Bhatia