python中xml解析sax_python:SAX解析XML

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