mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
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.
This commit is contained in:
parent
c1a6836305
commit
6b03ee6033
4 changed files with 66 additions and 0 deletions
|
@ -11,6 +11,7 @@ except SAXReaderNotAvailable:
|
||||||
from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \
|
from xml.sax.saxutils import XMLGenerator, escape, unescape, quoteattr, \
|
||||||
XMLFilterBase
|
XMLFilterBase
|
||||||
from xml.sax.expatreader import create_parser
|
from xml.sax.expatreader import create_parser
|
||||||
|
from xml.sax.handler import feature_namespaces
|
||||||
from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
|
from xml.sax.xmlreader import InputSource, AttributesImpl, AttributesNSImpl
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
from test.support import findfile, run_unittest
|
from test.support import findfile, run_unittest
|
||||||
|
@ -385,6 +386,60 @@ class XmlgenTest(unittest.TestCase):
|
||||||
self.assertEquals(result.getvalue(),
|
self.assertEquals(result.getvalue(),
|
||||||
start+'<my:a xmlns:my="qux" b="c"/>')
|
start+'<my:a xmlns:my="qux" b="c"/>')
|
||||||
|
|
||||||
|
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):
|
class XMLFilterBaseTest(unittest.TestCase):
|
||||||
def test_filter_basic(self):
|
def test_filter_basic(self):
|
||||||
|
|
|
@ -100,6 +100,12 @@ class XMLGenerator(handler.ContentHandler):
|
||||||
def _qname(self, name):
|
def _qname(self, name):
|
||||||
"""Builds a qualified name from a (ns_url, localname) pair"""
|
"""Builds a qualified name from a (ns_url, localname) pair"""
|
||||||
if name[0]:
|
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
|
# The name is in a non-empty namespace
|
||||||
prefix = self._current_context[name[0]]
|
prefix = self._current_context[name[0]]
|
||||||
if prefix:
|
if prefix:
|
||||||
|
|
|
@ -257,6 +257,7 @@ Greg Ewing
|
||||||
Martijn Faassen
|
Martijn Faassen
|
||||||
Andreas Faerber
|
Andreas Faerber
|
||||||
Bill Fancher
|
Bill Fancher
|
||||||
|
Troy J. Farrell
|
||||||
Mark Favas
|
Mark Favas
|
||||||
Niels Ferguson
|
Niels Ferguson
|
||||||
Sebastian Fernandez
|
Sebastian Fernandez
|
||||||
|
|
|
@ -51,6 +51,10 @@ Core and Builtins
|
||||||
Library
|
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 #5975: Add csv.unix_dialect class.
|
- Issue #5975: Add csv.unix_dialect class.
|
||||||
|
|
||||||
- Issue #7761: telnetlib.interact failures on Windows fixed.
|
- Issue #7761: telnetlib.interact failures on Windows fixed.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue