python xml.dom.minidom.Attr question

rudy picture rudy · May 7, 2010 · Viewed 10.6k times · Source

Getting attributes using minidom in Python, one uses the "attributes" property. e.g. node.attributes["id"].value

So if I have <a id="foo"></a>, that should give me "foo". node.attributes["id"] does not return the value of the named attribute, but an xml.dom.minidom.Attr instance. But looking at the help for Attr, by doing help('xml.dom.minidom.Attr'), nowhere is this magic "value" property mentioned. I like to learn APIs by looking at the type hierarchy, instance methods etc. Where did this "value" property come from?? Why is it not listed in the Attr class' page? The only data descriptors mentioned are isId, localName and schemaType. Its also not inherited from any superclasses. Since I'm new to Python, would some of the Python gurus enlighten?

Answer

Alex Martelli picture Alex Martelli · May 7, 2010

The minidom is just an implementation of the xml.dom interfaces, so any docs specifically on minidom will only be about its peculiarities or limitations wrt xml.dom itself.

The xml.dom docs on Attr say, and I quote:

Attr inherits from Node, so inherits all its attributes.

The docs on Node actually name the attribute differently: nodeValue. But, indeed...:

>>> import xml.dom.minidom as xdm
>>> dom = xdm.parseString('<foo bar="baz"/>')
>>> root = dom.documentElement
>>> atr = root.getAttributeNode('bar')
>>> atr.nodeValue
u'baz'

The fact that the documented nodeValue attribute has an _un_documented alias value may be considered unfortunate, but you can always stick with the documented, and therefore arguably right, attribute name, nodeValue. Yes, it's verbose, but then so is all of minidom, as well as slower than the excellent xml.etree.ElementTree (esp. in the latter's C implementation, xml.etree.cElementTree), so presumably if you choose to use minidom it must be because you like extensive verbosity...;-).