diff --git a/Demo/xml/elem_count.py b/Demo/xml/elem_count.py new file mode 100644 index 00000000000..43161999a11 --- /dev/null +++ b/Demo/xml/elem_count.py @@ -0,0 +1,36 @@ +import sys + +from xml.sax import make_parser, handler + +class FancyCounter(handler.ContentHandler): + + def __init__(self): + self._elems = 0 + self._attrs = 0 + self._elem_types = {} + self._attr_types = {} + + def startElement(self, name, attrs): + self._elems = self._elems + 1 + self._attrs = self._attrs + len(attrs) + self._elem_types[name] = self._elem_types.get(name, 0) + 1 + + for name in attrs.keys(): + self._attr_types[name] = self._attr_types.get(name, 0) + 1 + + def endDocument(self): + print "There were", self._elems, "elements." + print "There were", self._attrs, "attributes." + + print "---ELEMENT TYPES" + for pair in self._elem_types.items(): + print "%20s %d" % pair + + print "---ATTRIBUTE TYPES" + for pair in self._attr_types.items(): + print "%20s %d" % pair + + +parser = make_parser() +parser.setContentHandler(FancyCounter()) +parser.parse(sys.argv[1]) diff --git a/Demo/xml/roundtrip.py b/Demo/xml/roundtrip.py new file mode 100644 index 00000000000..e42bf1b3c75 --- /dev/null +++ b/Demo/xml/roundtrip.py @@ -0,0 +1,45 @@ +""" +A simple demo that reads in an XML document and spits out an equivalent, +but not necessarily identical, document. +""" + +import sys, string + +from xml.sax import saxutils, handler, make_parser + +# --- The ContentHandler + +class ContentGenerator(handler.ContentHandler): + + def __init__(self, out = sys.stdout): + handler.ContentHandler.__init__(self) + self._out = out + + # ContentHandler methods + + def startDocument(self): + self._out.write('\n') + + def startElement(self, name, attrs): + self._out.write('<' + name) + for (name, value) in attrs.items(): + self._out.write(' %s="%s"' % (name, saxutils.escape(value))) + self._out.write('>') + + def endElement(self, name): + self._out.write('' % name) + + def characters(self, content): + self._out.write(saxutils.escape(content)) + + def ignorableWhitespace(self, content): + self._out.write(content) + + def processingInstruction(self, target, data): + self._out.write('' % (target, data)) + +# --- The main program + +parser = make_parser() +parser.setContentHandler(ContentGenerator()) +parser.parse(sys.argv[1]) diff --git a/Demo/xml/rss2html.py b/Demo/xml/rss2html.py new file mode 100644 index 00000000000..df5d1c7c073 --- /dev/null +++ b/Demo/xml/rss2html.py @@ -0,0 +1,91 @@ +import sys + +from xml.sax import make_parser, handler + +# --- Templates + +top = \ +""" + + + + %s + + + +

%s

+""" + +bottom = \ +""" + + +
+
+Converted to HTML by sax_rss2html.py. +
+ + + +""" + +# --- The ContentHandler + +class RSSHandler(handler.ContentHandler): + + def __init__(self, out = sys.stdout): + handler.ContentHandler.__init__(self) + self._out = out + + self._text = "" + self._parent = None + self._list_started = 0 + self._title = None + self._link = None + self._descr = "" + + # ContentHandler methods + + def startElement(self, name, attrs): + if name == "channel" or name == "image" or name == "item": + self._parent = name + + self._text = "" + + def endElement(self, name): + if self._parent == "channel": + if name == "title": + self._out.write(top % (self._text, self._text)) + elif name == "description": + self._out.write("

%s

\n" % self._text) + + elif self._parent == "item": + if name == "title": + self._title = self._text + elif name == "link": + self._link = self._text + elif name == "description": + self._descr = self._text + elif name == "item": + if not self._list_started: + self._out.write("