From: Martin v. Löwis Date: Mon, 12 Feb 2007 12:21:41 +0000 (+0000) Subject: Patch 1463026: Support default namespace in XMLGenerator. X-Git-Tag: v2.5.1c1~116 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=626b2e992fc54233716c79627e5e4ce833ff9f12;p=python Patch 1463026: Support default namespace in XMLGenerator. Fixes #847665. --- diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py index af4c7dd8f4..2191f325c5 100644 --- a/Lib/test/test_sax.py +++ b/Lib/test/test_sax.py @@ -216,7 +216,44 @@ def test_xmlgen_ns(): ('' % 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+'' + +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+'' + +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+'' + +# ===== Xmlfilterbase def test_filter_basic(): result = StringIO() diff --git a/Lib/xml/sax/saxutils.py b/Lib/xml/sax/saxutils.py index a4965192fa..46818f3d81 100644 --- a/Lib/xml/sax/saxutils.py +++ b/Lib/xml/sax/saxutils.py @@ -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('' % 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('' % name) + self._write('' % self._qname(name)) def characters(self, content): self._write(escape(content)) diff --git a/Misc/NEWS b/Misc/NEWS index e6832c6fc8..c79f0b5fd1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -169,6 +169,8 @@ Extension Modules Library ------- +- Patch 1463026: Support default namespace in XMLGenerator. + - Patch 1571379: Make trace's --ignore-dir facility work in the face of relative directory names.