This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author Martin Hosken
Recipients Martin Hosken, eli.bendersky, scoder, serhiy.storchaka
Date 2018-09-10.03:51:38
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1536551499.12.0.56676864532.issue34600@psf.upfronthosting.co.za>
In-reply-to
Content
Blast. Bugs. Sorry. Missing superclass init call in CommentingTb. I enclose the whole thing again to save editing. Also fixes comment output to give text.

from __future__ import print_function
import sys
import xml.etree.ElementTree as et
import xml.etree.cElementTree as cet
from io import StringIO

teststr = u"""<?xml version="1"?>
<root>
    <child>
        Hello <!-- Greeting --> World
    </child>
</root>"""
testf = StringIO(teststr)

if len(sys.argv) >= 2 and 'a' in sys.argv[1]:
    testf.seek(0)
    for event, elem in et.iterparse(testf, events=["end", "comment"]):
        if event == 'end':
            print(elem.tag + ": " + str(elem.text))
        elif event == 'comment':
            print("comment: " + elem.text)

if len(sys.argv) < 2 or 'b' in sys.argv[1]:
    testf.seek(0)
    def doComment(data):
        parser.parser.StartElementHandler("!--", ('text', data))
        parser.parser.EndElementHandler("!--")
    parser = et.XMLParser()
    parser.parser.CommentHandler = doComment
    for event, elem in et.iterparse(testf, parser=parser):
        if elem.tag == "!--":
            print(elem.tag + ": " + elem.get('text', ""))
        else:
            print(elem.tag + ": " + str(elem.text))

if len(sys.argv) < 2 or 'c' in sys.argv[1] or 'd' in sys.argv[1]:
    testf.seek(0)
    useet = et if len(sys.argv) < 2 or 'c' in sys.argv[1] else cet
    class CommentingTb(useet.TreeBuilder):
        def __init__(self):
            useet.TreeBuilder.__init__(self)
            self.parser = None
        def comment(self, data):
            self.parser.parser.StartElementHandler("!--", ('text', data))
            self.parser.parser.EndElementHandler("!--")
    tb = CommentingTb()
    parser = useet.XMLParser(target=tb)
    tb.parser = parser
    kw = {'parser': parser} if len(sys.argv) < 2 or 'c' in sys.argv[1] else {}
    for event, elem in useet.iterparse(testf, **kw):
        if elem.tag == "!--":
            print(elem.tag + ": " + elem.get('text', ""))
        else:
            print(elem.tag + ": " + str(elem.text))
History
Date User Action Args
2018-09-10 03:51:39Martin Hoskensetrecipients: + Martin Hosken, scoder, eli.bendersky, serhiy.storchaka
2018-09-10 03:51:39Martin Hoskensetmessageid: <1536551499.12.0.56676864532.issue34600@psf.upfronthosting.co.za>
2018-09-10 03:51:39Martin Hoskenlinkissue34600 messages
2018-09-10 03:51:38Martin Hoskencreate