sax hanlder
| 40 | |
| 41 | |
| 42 | class Handler(ContentHandler): |
| 43 | """ sax hanlder """ |
| 44 | |
| 45 | def __init__(self): |
| 46 | self.nodes = [Document()] |
| 47 | |
| 48 | def startElement(self, name, attrs): |
| 49 | top = self.top() |
| 50 | node = Element(unicode(name), parent=top) |
| 51 | for a in attrs.getNames(): |
| 52 | n = unicode(a) |
| 53 | v = unicode(attrs.getValue(a)) |
| 54 | attribute = Attribute(n, v) |
| 55 | if self.mapPrefix(node, attribute): |
| 56 | continue |
| 57 | node.append(attribute) |
| 58 | node.charbuffer = [] |
| 59 | top.append(node) |
| 60 | self.push(node) |
| 61 | |
| 62 | def mapPrefix(self, node, attribute): |
| 63 | skip = False |
| 64 | if attribute.name == 'xmlns': |
| 65 | if len(attribute.value): |
| 66 | node.expns = unicode(attribute.value) |
| 67 | skip = True |
| 68 | elif attribute.prefix == 'xmlns': |
| 69 | prefix = attribute.name |
| 70 | node.nsprefixes[prefix] = unicode(attribute.value) |
| 71 | skip = True |
| 72 | return skip |
| 73 | |
| 74 | def endElement(self, name): |
| 75 | name = unicode(name) |
| 76 | current = self.top() |
| 77 | if len(current.charbuffer): |
| 78 | current.text = Text(u''.join(current.charbuffer)) |
| 79 | del current.charbuffer |
| 80 | if len(current): |
| 81 | current.trim() |
| 82 | currentqname = current.qname() |
| 83 | if name == currentqname: |
| 84 | self.pop() |
| 85 | else: |
| 86 | raise Exception('malformed document') |
| 87 | |
| 88 | def characters(self, content): |
| 89 | text = unicode(content) |
| 90 | node = self.top() |
| 91 | node.charbuffer.append(text) |
| 92 | |
| 93 | def push(self, node): |
| 94 | self.nodes.append(node) |
| 95 | return node |
| 96 | |
| 97 | def pop(self): |
| 98 | return self.nodes.pop() |
| 99 |