diff -r df57314b93d1 Lib/test/test_sax.py --- a/Lib/test/test_sax.py Sat Feb 23 22:11:21 2013 -0500 +++ b/Lib/test/test_sax.py Sun Feb 24 10:50:47 2013 +0200 @@ -403,6 +403,21 @@ func(result) self.assertFalse(result.closed) + def test_xmlgen_fragment(self): + result = self.ioclass() + gen = XMLGenerator(result) + + # Don't call gen.startDocument() + gen.startElement("foo", {"a": "1.0"}) + gen.characters("Hello") + gen.endElement("foo") + gen.startElement("bar", {"b": "2.0"}) + gen.endElement("bar") + # Don't call gen.endDocument() + + self.assertEqual(result.getvalue(), + 'Hello') + class StringXmlgenTest(XmlgenTest, unittest.TestCase): ioclass = StringIO diff -r df57314b93d1 Lib/xml/sax/saxutils.py --- a/Lib/xml/sax/saxutils.py Sat Feb 23 22:11:21 2013 -0500 +++ b/Lib/xml/sax/saxutils.py Sun Feb 24 10:50:47 2013 +0200 @@ -98,9 +98,13 @@ except AttributeError: pass # wrap a binary writer with TextIOWrapper - return io.TextIOWrapper(buffer, encoding=encoding, - errors='xmlcharrefreplace', - newline='\n') + class UnbufferedTextIOWrapper(io.TextIOWrapper): + def write(self, s): + super(UnbufferedTextIOWrapper, self).write(s) + self.flush() + return UnbufferedTextIOWrapper(buffer, encoding=encoding, + errors='xmlcharrefreplace', + newline='\n') class XMLGenerator(handler.ContentHandler):