1# Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/ 2# 3# Permission is hereby granted, free of charge, to any person obtaining a 4# copy of this software and associated documentation files (the 5# "Software"), to deal in the Software without restriction, including 6# without limitation the rights to use, copy, modify, merge, publish, dis- 7# tribute, sublicense, and/or sell copies of the Software, and to permit 8# persons to whom the Software is furnished to do so, subject to the fol- 9# lowing conditions: 10# 11# The above copyright notice and this permission notice shall be included 12# in all copies or substantial portions of the Software. 13# 14# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- 16# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 17# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 20# IN THE SOFTWARE. 21 22import xml.sax 23 24from boto.compat import StringIO 25 26 27class XmlHandler(xml.sax.ContentHandler): 28 29 def __init__(self, root_node, connection): 30 self.connection = connection 31 self.nodes = [('root', root_node)] 32 self.current_text = '' 33 34 def startElement(self, name, attrs): 35 self.current_text = '' 36 new_node = self.nodes[-1][1].startElement(name, attrs, self.connection) 37 if new_node is not None: 38 self.nodes.append((name, new_node)) 39 40 def endElement(self, name): 41 self.nodes[-1][1].endElement(name, self.current_text, self.connection) 42 if self.nodes[-1][0] == name: 43 if hasattr(self.nodes[-1][1], 'endNode'): 44 self.nodes[-1][1].endNode(self.connection) 45 self.nodes.pop() 46 self.current_text = '' 47 48 def characters(self, content): 49 self.current_text += content 50 51 52class XmlHandlerWrapper(object): 53 def __init__(self, root_node, connection): 54 self.handler = XmlHandler(root_node, connection) 55 self.parser = xml.sax.make_parser() 56 self.parser.setContentHandler(self.handler) 57 self.parser.setFeature(xml.sax.handler.feature_external_ges, 0) 58 59 def parseString(self, content): 60 return self.parser.parse(StringIO(content)) 61