Bugs item #847665, was opened at 2003-11-23 16:21 Message generated for change (Comment added) made by loewis You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=105470&aid=847665&group_id=5470
Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: XML Group: Python 2.3 >Status: Closed >Resolution: Fixed Priority: 5 Private: No Submitted By: Stuart Bishop (zenzen) Assigned to: Nobody/Anonymous (nobody) Summary: XMLGenerator.startElementNS dies on EMPTY_NAMESPACE attribut Initial Comment: from xml.sax.saxutils import XMLGenerator g = XMLGenerator(encoding='utf8') STREAM_NAMESPACE = 'http://etherx.jabber.org/streams' CLIENT_NAMESPACE = 'jabber:client' g.startDocument() g.startPrefixMapping('stream', STREAM_NAMESPACE) g.startPrefixMapping('client', CLIENT_NAMESPACE) g.startElementNS( (STREAM_NAMESPACE, 'stream'), 'stream', {(None,'xmlns'): CLIENT_NAMESPACE} ) Dies with: Traceback (most recent call last): File "tst.py", line 11, in ? g.startElementNS( File "/System/Library/Frameworks/Python.framework/ Versions/2.3/lib/python2.3/xml/sax/saxutils.py", line 124, in startElementNS name = self._current_context[name[0]] + ":" + name[1] KeyError: 'x' Changing the end of XMLGenerator.startElementNS to the following makes it work the way I expect: for (name, value) in attrs.items(): if name[0] is None: name = name[1] else: name = self._current_context[name[0]] + ":" + name[1] self._out.write(' %s=%s' % (name, quoteattr(value))) self._out.write('>') ---------------------------------------------------------------------- >Comment By: Martin v. Löwis (loewis) Date: 2007-02-12 13:23 Message: Logged In: YES user_id=21627 Originator: NO This is now fixed in r53754 and r53755. ---------------------------------------------------------------------- Comment By: Nikolai Grigoriev (ngrig) Date: 2006-03-26 23:29 Message: Logged In: YES user_id=195108 This issue lasts for 2.5 years already. I feel like it is somewhat stalled. The processing of XML namespaces in saxutils.XMLGenerator is so blatantly broken that I wonder if it ever has been tested at all. I wrote down a simple smoke test for it: import sys from xml import sax from xml.sax.saxutils import XMLGenerator from StringIO import StringIO tests = [ ("No namespace, no attributes", "<a/>"), ("No namespace, with attributes", "<a b='c'/>"), ("Empty prefix, no attributes", "<a xmlns='qux'/>"), ("Empty prefix, unprefixed attributes", "<a xmlns='qux' b='c'/>"), ("Prefixed, no attributes", "<my:a xmlns:my='qux'/>"), ("Prefixed, unprefixed attributes", "<my:a xmlns:my='qux' b='c'/>"), ("Prefixed, prefixed attributes", "<my:a xmlns:my='qux' my:b='c'/>"), ] for (caption, testdoc) in tests: try: parser = sax.make_parser() parser.setFeature(sax.handler.feature_namespaces, 1) parser.setContentHandler(XMLGenerator(StringIO())) parser.parse(StringIO(testdoc)) print caption, "- OK" except StandardError, e: print caption, "- FAILED:", e.__class__.__name__ With the current version of saxutils (as of Python 2.4.1), I get 4 failures out of 7. Stuart Bishop's patch fixes the issue; could someone commit it please? ---------------------------------------------------------------------- Comment By: A.M. Kuchling (akuchling) Date: 2005-12-04 21:15 Message: Logged In: YES user_id=11375 Please provide your changes in the form of a patch. ---------------------------------------------------------------------- Comment By: A.M. Kuchling (akuchling) Date: 2005-12-04 21:02 Message: Logged In: YES user_id=11375 Never mind my previous comment; I just noticed the setContentHandler call. ---------------------------------------------------------------------- Comment By: A.M. Kuchling (akuchling) Date: 2005-12-04 21:01 Message: Logged In: YES user_id=11375 I don't understand your second example; it uses saxutils to parse a file. What's it got to do with XMLGenerator? ---------------------------------------------------------------------- Comment By: Stuart Bishop (zenzen) Date: 2003-11-24 20:36 Message: Logged In: YES user_id=46639 This method also appears to have trouble emmitting tags without a namespace prefix: import xml.sax import xml.sax.handler import xml.sax.saxutils x = '''<?xml version="1.0"?><mechanisms xmlns='urn:ietf: params:xml:ns:xmpp-sasl' >''' parser = xml.sax.make_parser() parser.setFeature(xml.sax.handler.feature_namespaces, True) parser.setContentHandler(xml.sax.saxutils.XMLGenerator()) parser.feed(x) dies with: Traceback (most recent call last): File "tst.py", line 30, in ? parser.feed(x) File "/System/Library/Frameworks/Python.framework/Versions/ 2.3/lib/python2.3/xml/sax/expatreader.py", line 207, in feed self._parser.Parse(data, isFinal) File "/System/Library/Frameworks/Python.framework/Versions/ 2.3/lib/python2.3/xml/sax/expatreader.py", line 337, in start_element_ns AttributesNSImpl(newattrs, qnames)) File "/System/Library/Frameworks/Python.framework/Versions/ 2.3/lib/python2.3/xml/sax/saxutils.py", line 116, in startElementNS name = self._current_context[name[0]] + ":" + name[1] TypeError: unsupported operand type(s) for +: 'NoneType' and 'str' I've attached my current replacement startElementNS method which appears to fix both this and the previous issue. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=105470&aid=847665&group_id=5470 _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com