mirror of
https://github.com/python/cpython.git
synced 2025-07-29 22:24:49 +00:00
Patch 1463026: Support default namespace in XMLGenerator.
Fixes #847665. Will backport.
This commit is contained in:
parent
a69aa327aa
commit
2bad58f5a4
3 changed files with 59 additions and 17 deletions
|
@ -216,7 +216,44 @@ def test_xmlgen_ns():
|
|||
('<ns1:doc xmlns:ns1="%s"><udoc></udoc></ns1:doc>' %
|
||||
ns_uri)
|
||||
|
||||
# ===== XMLFilterBase
|
||||
def test_1463026_1():
|
||||
result = StringIO()
|
||||
gen = XMLGenerator(result)
|
||||
|
||||
gen.startDocument()
|
||||
gen.startElementNS((None, 'a'), 'a', {(None, 'b'):'c'})
|
||||
gen.endElementNS((None, 'a'), 'a')
|
||||
gen.endDocument()
|
||||
|
||||
return result.getvalue() == start+'<a b="c"></a>'
|
||||
|
||||
def test_1463026_2():
|
||||
result = StringIO()
|
||||
gen = XMLGenerator(result)
|
||||
|
||||
gen.startDocument()
|
||||
gen.startPrefixMapping(None, 'qux')
|
||||
gen.startElementNS(('qux', 'a'), 'a', {})
|
||||
gen.endElementNS(('qux', 'a'), 'a')
|
||||
gen.endPrefixMapping(None)
|
||||
gen.endDocument()
|
||||
|
||||
return result.getvalue() == start+'<a xmlns="qux"></a>'
|
||||
|
||||
def test_1463026_3():
|
||||
result = StringIO()
|
||||
gen = XMLGenerator(result)
|
||||
|
||||
gen.startDocument()
|
||||
gen.startPrefixMapping('my', 'qux')
|
||||
gen.startElementNS(('qux', 'a'), 'a', {(None, 'b'):'c'})
|
||||
gen.endElementNS(('qux', 'a'), 'a')
|
||||
gen.endPrefixMapping('my')
|
||||
gen.endDocument()
|
||||
|
||||
return result.getvalue() == start+'<my:a xmlns:my="qux" b="c"></my:a>'
|
||||
|
||||
# ===== Xmlfilterbase
|
||||
|
||||
def test_filter_basic():
|
||||
result = StringIO()
|
||||
|
|
|
@ -100,6 +100,17 @@ class XMLGenerator(handler.ContentHandler):
|
|||
else:
|
||||
self._out.write(text.encode(self._encoding, _error_handling))
|
||||
|
||||
def _qname(self, name):
|
||||
"""Builds a qualified name from a (ns_url, localname) pair"""
|
||||
if name[0]:
|
||||
# The name is in a non-empty namespace
|
||||
prefix = self._current_context[name[0]]
|
||||
if prefix:
|
||||
# If it is not the default namespace, prepend the prefix
|
||||
return prefix + ":" + name[1]
|
||||
# Return the unqualified name
|
||||
return name[1]
|
||||
|
||||
# ContentHandler methods
|
||||
|
||||
def startDocument(self):
|
||||
|
@ -125,29 +136,21 @@ class XMLGenerator(handler.ContentHandler):
|
|||
self._write('</%s>' % name)
|
||||
|
||||
def startElementNS(self, name, qname, attrs):
|
||||
if name[0] is None:
|
||||
# if the name was not namespace-scoped, use the unqualified part
|
||||
name = name[1]
|
||||
else:
|
||||
# else try to restore the original prefix from the namespace
|
||||
name = self._current_context[name[0]] + ":" + name[1]
|
||||
self._write('<' + name)
|
||||
self._write('<' + self._qname(name))
|
||||
|
||||
for pair in self._undeclared_ns_maps:
|
||||
self._write(' xmlns:%s="%s"' % pair)
|
||||
for prefix, uri in self._undeclared_ns_maps:
|
||||
if prefix:
|
||||
self._out.write(' xmlns:%s="%s"' % (prefix, uri))
|
||||
else:
|
||||
self._out.write(' xmlns="%s"' % uri)
|
||||
self._undeclared_ns_maps = []
|
||||
|
||||
for (name, value) in attrs.items():
|
||||
name = self._current_context[name[0]] + ":" + name[1]
|
||||
self._write(' %s=%s' % (name, quoteattr(value)))
|
||||
self._write(' %s=%s' % (self._qname(name), quoteattr(value)))
|
||||
self._write('>')
|
||||
|
||||
def endElementNS(self, name, qname):
|
||||
if name[0] is None:
|
||||
name = name[1]
|
||||
else:
|
||||
name = self._current_context[name[0]] + ":" + name[1]
|
||||
self._write('</%s>' % name)
|
||||
self._write('</%s>' % self._qname(name))
|
||||
|
||||
def characters(self, content):
|
||||
self._write(escape(content))
|
||||
|
|
|
@ -128,6 +128,8 @@ Core and builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Patch 1463026: Support default namespace in XMLGenerator.
|
||||
|
||||
- Patch 1571379: Make trace's --ignore-dir facility work in the face of
|
||||
relative directory names.
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue