--- /usr/lib/python2.5/xml/sax/saxutils.py 2007-05-02 18:56:40.000000000 +0200 +++ xml/sax/saxutils.py 2007-10-22 22:44:33.000000000 +0200 @@ -4,8 +4,8 @@ convenience of application and driver wr """ import os, urlparse, urllib, types -import handler -import xmlreader +from xml.sax import handler +from xml.sax import xmlreader try: _StringTypes = [types.StringType, types.UnicodeType] @@ -93,6 +93,7 @@ class XMLGenerator(handler.ContentHandle self._current_context = self._ns_contexts[-1] self._undeclared_ns_maps = [] self._encoding = encoding + self._pending_start_element = False def _write(self, text): if isinstance(text, str): @@ -111,6 +112,11 @@ class XMLGenerator(handler.ContentHandle # Return the unqualified name return name[1] + def _finish_pending_start_element(self,endElement=False): + if self._pending_start_element: + self._write('>') + self._pending_start_element = False + # ContentHandler methods def startDocument(self): @@ -127,15 +133,21 @@ class XMLGenerator(handler.ContentHandle del self._ns_contexts[-1] def startElement(self, name, attrs): + self._finish_pending_start_element() self._write('<' + name) for (name, value) in attrs.items(): self._write(' %s=%s' % (name, quoteattr(value))) - self._write('>') + self._pending_start_element = True def endElement(self, name): - self._write('' % name) + if self._pending_start_element: + self._write('/>') + self._pending_start_element = False + else: + self._write('' % name) def startElementNS(self, name, qname, attrs): + self._finish_pending_start_element() self._write('<' + self._qname(name)) for prefix, uri in self._undeclared_ns_maps: @@ -147,18 +159,27 @@ class XMLGenerator(handler.ContentHandle for (name, value) in attrs.items(): self._write(' %s=%s' % (self._qname(name), quoteattr(value))) - self._write('>') + self._pending_start_element = True def endElementNS(self, name, qname): - self._write('' % self._qname(name)) + if self._pending_start_element: + self._write('/>') + self._pending_start_element = False + else: + self._write('' % self._qname(name)) def characters(self, content): - self._write(escape(content)) + if content: + self._finish_pending_start_element() + self._write(escape(content)) def ignorableWhitespace(self, content): - self._write(content) + if content: + self._finish_pending_start_element() + self._write(content) def processingInstruction(self, target, data): + self._finish_pending_start_element() self._write('' % (target, data))