[XML-SIG] help - attributes namespace - is this a bug in PyXML
Mike Brown
mike at skew.org
Mon Aug 16 20:08:26 CEST 2004
Ajay wrote:
> also getAttribute("appel:connective") returns " ", ie it is not None but
> when i print it out thats what i get
I'm not very experienced with using minidom but that's surprising to me.
>>> from xml.dom.minidom import parseString
>>> inputString = '<appel:RULE appel:empty="" appel:full="hi"/>'
>>> doc = parseString(inputString)
>>> doc.childNodes[0].getAttribute('appel:connective')
''
You're right: an empty byte string is returned in that case. I would've
expected None, too.
Given that an existing attribute results in a unicode object being returned,
e.g.
>>> doc.childNodes[0].getAttribute('appel:empty')
u''
>>> doc.childNodes[0].getAttribute('appel:full')
u'hi'
it seems weird that '' and u'' mean different things, but I am guessing the
intent was DOM conformance, and DOM demands that a string be returned (DOM is
a poorly designed API, by the way), and minidom's implementation is probably
supposed to return u'' in both cases. Therefore you should not be using
getAttribute()/getAttributeNS() to test for existence of an attribute.
What you should be doing is using hasAttribute or hasAttributeNS. The fact
that these methods are not documented at
http://www.python.org/doc/2.3.4/lib/dom-element-objects.html is a
documentation bug.
> funnily getAttribute("appel:connective") for an element thats doesn't have
> the attribute "appel:connective" still passes the test
> if element.getAttribute("appel:connective") != None
Per PEP 8 (coding style guide on python.org) always use "is None" or "is not
None" rather than "== None" or "!= None".
Again, a simple test shows why:
>>> '' != None
True
>>> '' == None
False
> so how can i retrieve an attribute of type "appel:connective", ie, prefixed
> by the uri appel
> and getAttributeNS doesn't work either. same as for getAttribute
I think you realize this, but appel is not a URI, it is a prefix.
http://www.w3.org/2001/02/appelv1 is a URI. (Well, technically, I think folks
are now saying that if it's being used as a namespace name, then it's not a
URI, it's just a string that is required to match the URI syntax)
Anyway, again, you're right, and I'd offer the same explanation as for
getAttribute().
>>> doc.childNodes[0].getAttributeNS('http://www.w3.org/2001/02/appelv1', 'connective')
''
More information about the XML-SIG
mailing list