DefaultSaxHandler是没有继承自DefaultHandler,如果继承了,它内部定义的start_element、end_element、char_data就是overwrite,如果没有继承,则是属于自定义,这点没有异议吧。关键不在于它是否继承,而是在于parser是否定义了这几个函数并实现了对应的处理函数,而DefaultSaxHandler中定义的几个函数相当于回调函数,在这里并不要求它是否继承自DefaultHandler。
下面是一个非常简单的例子,目标是寻找""中间的内容,当然,这个为了简单说明怎么work的,状态机跟XML的sax解析还是有些不同的。SAX的parser的工作原理基本上类似于此,但是效率肯定比下面这个版本高,内部的状态机也比下面这个复杂,仅供参考。
class MyParser(object):
def __init__(self):
self.findValue = None
def parse(self, inputString):
state_init = -1
state_start_elem = 0
state_end_elem = 2
element_found = ""
current_state = state_init
for eachChar in inputString:
if eachChar == "
current_state = state_start_elem
element_found = ""
continue
elif eachChar == ">" and (state_start_elem == current_state):
if self.findValue and callable(self.findValue):
self.findValue(element_found)
current_state = state_end_elem
else:
element_found += eachChar
class MyHandler(object):
def HaveFindAValue(self, valueName):
print "we have found a value " + valueName
a = MyHandler()
parser = MyParser()
parser.findValue = a.HaveFindAValue
parser.parse("hello")
输出
we have found a value XML
we have found a value XML2