| """ | 
 | 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('<?xml version="1.0" encoding="iso-8859-1"?>\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('</%s>' % 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('<?%s %s?>' % (target, data)) | 
 |  | 
 | # --- The main program | 
 |  | 
 | parser = make_parser() | 
 | parser.setContentHandler(ContentGenerator()) | 
 | parser.parse(sys.argv[1]) |