2222import string
2323import sys
2424import UserList
25+ import xml .sax
2526import xml .sax .saxutils
2627
2728from types import ListType , StringType , TupleType
2829
29- try :
30- from xml .parsers .xmllib import XMLParser
31- except ImportError :
32- from xmllib import XMLParser
33-
34-
3530from esistools import encode
3631
3732
@@ -439,14 +434,11 @@ def __init__(self, type, name=None, optional=0):
439434 self .implied = 0
440435
441436
442- class TableParser (XMLParser ):
443- def __init__ (self , table = None ):
444- if table is None :
445- table = {}
446- self .__table = table
447- self .__current = None
437+ class TableHandler (xml .sax .handler .ContentHandler ):
438+ def __init__ (self ):
439+ self .__table = {}
448440 self .__buffer = ''
449- XMLParser . __init__ ( self )
441+ self . __methods = {}
450442
451443 def get_table (self ):
452444 for entry in self .__table .values ():
@@ -457,6 +449,27 @@ def get_table(self):
457449 entry .has_content = 1
458450 return self .__table
459451
452+ def startElement (self , tag , attrs ):
453+ try :
454+ start , end = self .__methods [tag ]
455+ except KeyError :
456+ start = getattr (self , "start_" + tag , None )
457+ end = getattr (self , "end_" + tag , None )
458+ self .__methods [tag ] = (start , end )
459+ if start :
460+ start (attrs )
461+
462+ def endElement (self , tag ):
463+ start , end = self .__methods [tag ]
464+ if end :
465+ end ()
466+
467+ def endDocument (self ):
468+ self .__methods .clear ()
469+
470+ def characters (self , data ):
471+ self .__buffer += data
472+
460473 def start_environment (self , attrs ):
461474 name = attrs ["name" ]
462475 self .__current = TableEntry (name , environment = 1 )
@@ -517,15 +530,11 @@ def end_text(self):
517530 p .text = self .__buffer
518531 self .__current .parameters .append (p )
519532
520- def handle_data (self , data ):
521- self .__buffer = self .__buffer + data
522-
523533
524- def load_table (fp , table = None ):
525- parser = TableParser (table = table )
526- parser .feed (fp .read ())
527- parser .close ()
528- return parser .get_table ()
534+ def load_table (fp ):
535+ ch = TableHandler ()
536+ xml .sax .parse (fp , ch )
537+ return ch .get_table ()
529538
530539
531540def main ():
0 commit comments