Commit 2bad58f5 authored by Martin v. Löwis's avatar Martin v. Löwis

Patch 1463026: Support default namespace in XMLGenerator.

Fixes #847665. Will backport.
parent a69aa327
......@@ -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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment