Minor fix for qdom debug output.
[zeroinstall.git] / zeroinstall / injector / qdom.py
blob540550f9559706de41787ff79eb42e3203e98761
1 """A quick DOM implementation.
3 Python's xml.dom is very slow. The xml.sax module is also slow (as it imports urllib2).
4 This is our light-weight version.
5 """
7 # Copyright (C) 2006, Thomas Leonard
8 # See the README file for details, or visit http://0install.net.
10 from xml.parsers import expat
11 import sys
13 class Element(object):
14 __slots__ = ['uri', 'name', 'attrs', 'childNodes', 'content']
15 def __init__(self, uri, name, attrs):
16 self.uri = uri
17 self.name = name
18 self.attrs = attrs.copy()
19 self.childNodes = []
21 def __str__(self):
22 attrs = [n + '=' + self.attrs[n] for n in self.attrs]
23 start = '<{%s}%s %s' % (self.uri, self.name, ' '.join(attrs))
24 if self.childNodes:
25 return start + '>' + '\n'.join(map(str, self.childNodes)) + ('</%s>' % (self.name))
26 elif self.content:
27 return start + '>' + self.content + ('</%s>' % (self.name))
28 else:
29 return start + '/>'
31 def getAttribute(self, name):
32 return self.attrs.get(name, None)
34 class QSAXhandler:
35 def __init__(self):
36 self.stack = []
38 def startElementNS(self, fullname, attrs):
39 split = fullname.split(' ', 1)
40 if len(split) == 2:
41 self.stack.append(Element(split[0], split[1], attrs))
42 else:
43 self.stack.append(Element(None, fullname, attrs))
44 self.contents = ''
46 def characters(self, data):
47 self.contents += data
49 def endElementNS(self, name):
50 contents = self.contents.strip()
51 self.stack[-1].content = contents
52 self.contents = ''
53 new = self.stack.pop()
54 if self.stack:
55 self.stack[-1].childNodes.append(new)
56 else:
57 self.doc = new
59 def parse(source):
60 handler = QSAXhandler()
61 parser = expat.ParserCreate(namespace_separator = ' ')
63 parser.StartElementHandler = handler.startElementNS
64 parser.EndElementHandler = handler.endElementNS
65 parser.CharacterDataHandler = handler.characters
67 parser.ParseFile(source)
68 return handler.doc