panzi added the comment:

patch for _xmlplus.sax.saxutils.py

Added file: http://bugs.python.org/file8632/_xmlplus.sax.saxutils.patch

__________________________________
Tracker <[EMAIL PROTECTED]>
<http://bugs.python.org/issue1343>
__________________________________
--- /usr/lib/python2.5/site-packages/_xmlplus/sax/saxutils.py	2004-11-29 13:36:36.000000000 +0100
+++ site-packages/_xmlplus/sax/saxutils.py	2007-10-22 22:44:54.000000000 +0200
@@ -6,9 +6,11 @@ $Id: saxutils.py,v 1.35 2004/03/20 07:46
 """
 
 import os, urlparse, urllib2, types
-import handler
-import xmlreader
-import sys, _exceptions, saxlib
+from xml.sax import handler
+from xml.sax import xmlreader
+from xml.sax import _exceptions
+from xml.sax import saxlib
+import sys
 
 try:
     _StringTypes = [types.StringType, types.UnicodeType]
@@ -173,7 +175,7 @@ class ErrorRaiser:
             raise exception
 
 # --- AttributesImpl now lives in xmlreader
-from xmlreader import AttributesImpl
+from xml.sax.xmlreader import AttributesImpl
 
 # --- XMLGenerator is the SAX2 ContentHandler for writing back XML
 import codecs
@@ -231,7 +233,12 @@ class XMLGenerator(handler.ContentHandle
         self._undeclared_ns_maps = []
         self._encoding = encoding
         self._generated_prefix_ctr = 0
-        return
+        self._pending_start_element = False
+
+    def _finish_pending_start_element(self,endElement=False):
+        if self._pending_start_element:
+            self._out.write('>')
+            self._pending_start_element = False
 
     # ContentHandler methods
 
@@ -249,16 +256,22 @@ class XMLGenerator(handler.ContentHandle
         del self._ns_contexts[-1]
 
     def startElement(self, name, attrs):
+        self._finish_pending_start_element()
         self._out.write('<' + name)
         for (name, value) in attrs.items():
             self._out.write(' %s=' % name)
             writeattr(self._out, value)
-        self._out.write('>')
+        self._pending_start_element = True
 
     def endElement(self, name):
-        self._out.write('</%s>' % name)
+        if self._pending_start_element:
+            self._out.write('/>')
+            self._pending_start_element = False
+        else:
+            self._out.write('</%s>' % name)
 
     def startElementNS(self, name, qname, attrs):
+        self._finish_pending_start_element()
         if name[0] is None:
             name = name[1]
         elif self._current_context[name[0]] is None:
@@ -291,27 +304,36 @@ class XMLGenerator(handler.ContentHandle
                 name = self._current_context[name[0]] + ":" + name[1]
             self._out.write(' %s=' % name)
             writeattr(self._out, value)
-        self._out.write('>')
+        self._pending_start_element = True
 
     def endElementNS(self, name, qname):
-        # XXX: if qname is not None, we better use it.
-        # Python 2.0b2 requires us to use the recorded prefix for
-        # name[0], though
-        if name[0] is None:
-            qname = name[1]
-        elif self._current_context[name[0]] is None:
-            qname = name[1]
+        if self._pending_start_element:
+            self._out.write('/>')
+            self._pending_start_element = False
         else:
-            qname = self._current_context[name[0]] + ":" + name[1]
-        self._out.write('</%s>' % qname)
+            # XXX: if qname is not None, we better use it.
+            # Python 2.0b2 requires us to use the recorded prefix for
+            # name[0], though
+            if name[0] is None:
+                qname = name[1]
+            elif self._current_context[name[0]] is None:
+                qname = name[1]
+            else:
+                qname = self._current_context[name[0]] + ":" + name[1]
+            self._out.write('</%s>' % qname)
 
     def characters(self, content):
-        writetext(self._out, content)
+        if content:
+            self._finish_pending_start_element()
+            writetext(self._out, content)
 
     def ignorableWhitespace(self, content):
-        self._out.write(content)
+        if content:
+            self._finish_pending_start_element()
+            self._out.write(content)
 
     def processingInstruction(self, target, data):
+        self._finish_pending_start_element()
         self._out.write('<?%s %s?>' % (target, data))
 
 
@@ -323,10 +345,12 @@ class LexicalXMLGenerator(XMLGenerator, 
         self._in_cdata = 0
 
     def characters(self, content):
-        if self._in_cdata:
-            self._out.write(content.replace(']]>', ']]>]]&gt;<![CDATA['))
-        else:
-            self._out.write(escape(content))
+        if content:
+            self._finish_pending_start_element()
+            if self._in_cdata:
+                self._out.write(content.replace(']]>', ']]>]]&gt;<![CDATA['))
+            else:
+                self._out.write(escape(content))
 
     # LexicalHandler methods
     # (we only support the most important ones and inherit the rest)
@@ -344,11 +368,13 @@ class LexicalXMLGenerator(XMLGenerator, 
         self._out.write('>')
 
     def comment(self, content):
+        self._finish_pending_start_element()
         self._out.write('<!--')
         self._out.write(content)
         self._out.write('-->')
 
     def startCDATA(self):
+        self._finish_pending_start_element()
         self._in_cdata = 1
         self._out.write('<![CDATA[')
 
@@ -617,7 +643,6 @@ class EventBroadcaster:
         return "<EventBroadcaster instance at %d>" % id(self)
 
 # --- ESIS document handler
-import saxlib
 class ESISDocHandler(saxlib.HandlerBase):
     "A SAX document handler that produces naive ESIS output."
 
@@ -713,7 +738,7 @@ class mllib:
         self.reset()
 
     def reset(self):
-        import saxexts # only used here
+        from xml.sax import saxexts # only used here
         self.parser=saxexts.XMLParserFactory.make_parser()
         self.handler=mllib.Handler(self.parser,self)
         self.handler.reset()
_______________________________________________
Python-bugs-list mailing list 
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to