summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-10-27 18:43:21 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-10-27 18:43:21 (GMT)
commit7f08102bc68b65336ad12c2210daa832ebad3be5 (patch)
treee232661923769c12b1874db4c70fdc5a0d200750
parente1ff21413963af513932104c2730206d952b2537 (diff)
downloadcpython-7f08102bc68b65336ad12c2210daa832ebad3be5.zip
cpython-7f08102bc68b65336ad12c2210daa832ebad3be5.tar.gz
cpython-7f08102bc68b65336ad12c2210daa832ebad3be5.tar.bz2
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. ........
-rw-r--r--Lib/test/test_sax.py55
-rw-r--r--Lib/xml/sax/saxutils.py6
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS4
4 files changed, 66 insertions, 0 deletions
diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py
index df7daf1..11614ae 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+'<my:a xmlns:my="qux" b="c"></my:a>')
+ 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(
+ '<?xml version="1.0"?>'
+ '<a:g1 xmlns:a="http://example.com/ns">'
+ '<a:g2 xml:lang="en">Hello</a:g2>'
+ '</a:g1>')
+
+ 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 + (
+ '<a:g1 xmlns:a="http://example.com/ns">'
+ '<a:g2 xml:lang="en">Hello</a:g2>'
+ '</a:g1>'))
+
+ 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 + (
+ '<a:g1 xmlns:a="http://example.com/ns">'
+ '<a:g2 xml:lang="en">Hello</a:g2>'
+ '</a:g1>'))
+
class XMLFilterBaseTest(unittest.TestCase):
def test_filter_basic(self):
diff --git a/Lib/xml/sax/saxutils.py b/Lib/xml/sax/saxutils.py
index 46818f3..97d65d8 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 982af4c..b1bf91c 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 dcde292..5b89ec0 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.