From: Antoine Pitrou Date: Wed, 27 Oct 2010 18:43:21 +0000 (+0000) Subject: Merged revisions 85858 via svnmerge from X-Git-Tag: v2.7.1rc1~111 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7f08102bc68b65336ad12c2210daa832ebad3be5;p=python Merged revisions 85858 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r85858 | antoine.pitrou | 2010-10-27 20:33:30 +0200 (mer., 27 oct. 2010) | 5 lines Issue #5027: The standard `xml` namespace is now understood by xml.sax.saxutils.XMLGenerator as being bound to http://www.w3.org/XML/1998/namespace. Patch by Troy J. Farrell. ........ --- diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py index df7daf1955..11614ae4bf 100644 --- a/Lib/test/test_sax.py +++ b/Lib/test/test_sax.py @@ -11,6 +11,7 @@ except SAXReaderNotAvailable: from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \ XMLFilterBase from xml.sax.expatreader import create_parser +from xml.sax.handler import feature_namespaces from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl from cStringIO import StringIO from test.test_support import findfile, run_unittest @@ -290,6 +291,60 @@ class XmlgenTest(unittest.TestCase): self.assertEquals(result.getvalue(), start+'') + def test_5027_1(self): + # The xml prefix (as in xml:lang below) is reserved and bound by + # definition to http://www.w3.org/XML/1998/namespace. XMLGenerator had + # a bug whereby a KeyError is thrown because this namespace is missing + # from a dictionary. + # + # This test demonstrates the bug by parsing a document. + test_xml = StringIO( + '' + '' + 'Hello' + '') + + parser = make_parser() + parser.setFeature(feature_namespaces, True) + result = StringIO() + gen = XMLGenerator(result) + parser.setContentHandler(gen) + parser.parse(test_xml) + + self.assertEquals(result.getvalue(), + start + ( + '' + 'Hello' + '')) + + def test_5027_2(self): + # The xml prefix (as in xml:lang below) is reserved and bound by + # definition to http://www.w3.org/XML/1998/namespace. XMLGenerator had + # a bug whereby a KeyError is thrown because this namespace is missing + # from a dictionary. + # + # This test demonstrates the bug by direct manipulation of the + # XMLGenerator. + result = StringIO() + gen = XMLGenerator(result) + + gen.startDocument() + gen.startPrefixMapping('a', 'http://example.com/ns') + gen.startElementNS(('http://example.com/ns', 'g1'), 'g1', {}) + lang_attr = {('http://www.w3.org/XML/1998/namespace', 'lang'): 'en'} + gen.startElementNS(('http://example.com/ns', 'g2'), 'g2', lang_attr) + gen.characters('Hello') + gen.endElementNS(('http://example.com/ns', 'g2'), 'g2') + gen.endElementNS(('http://example.com/ns', 'g1'), 'g1') + gen.endPrefixMapping('a') + gen.endDocument() + + self.assertEquals(result.getvalue(), + start + ( + '' + 'Hello' + '')) + class XMLFilterBaseTest(unittest.TestCase): def test_filter_basic(self): diff --git a/Lib/xml/sax/saxutils.py b/Lib/xml/sax/saxutils.py index 46818f3d81..97d65d8fd3 100644 --- a/Lib/xml/sax/saxutils.py +++ b/Lib/xml/sax/saxutils.py @@ -103,6 +103,12 @@ class XMLGenerator(handler.ContentHandler): def _qname(self, name): """Builds a qualified name from a (ns_url, localname) pair""" if name[0]: + # Per http://www.w3.org/XML/1998/namespace, The 'xml' prefix is + # bound by definition to http://www.w3.org/XML/1998/namespace. It + # does not need to be declared and will not usually be found in + # self._current_context. + if 'http://www.w3.org/XML/1998/namespace' == name[0]: + return 'xml:' + name[1] # The name is in a non-empty namespace prefix = self._current_context[name[0]] if prefix: diff --git a/Misc/ACKS b/Misc/ACKS index 982af4cc4f..b1bf91ca31 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -242,6 +242,7 @@ Greg Ewing Martijn Faassen Andreas Faerber Bill Fancher +Troy J. Farrell Mark Favas Niels Ferguson Sebastian Fernandez diff --git a/Misc/NEWS b/Misc/NEWS index dcde292cb0..5b89ec09a8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -63,6 +63,10 @@ Core and Builtins Library ------- +- Issue #5027: The standard ``xml`` namespace is now understood by + xml.sax.saxutils.XMLGenerator as being bound to + http://www.w3.org/XML/1998/namespace. Patch by Troy J. Farrell. + - Issue #10163: Skip unreadable registry keys during mimetypes initialization.