fromxml.parsers.expatimportParserCreateclassDefaultSaxHandler(object):defstart_element(self,name,attrs):print('sax:start_element:%s,attrs:%s'%(name,str(attrs)))defend_element(self,name):print('sax:end_element:%s'%name)defchar_data(self,text):print('sax:char_data:%s'%text)xml=r'''PythonRuby'''handler=DefaultSaxHandler()parser=ParserCreate()parser.returns_unicode=Trueparser.StartElementHandler=handler.start_elementparser.EndElementHandler=handler.end_elementparser.CharacterDataHandler=handler.char_dataparser.Parse(xml)这段代码中DefaultSaxHandler类又没有继承DefaultHandler,它的实例handler怎么多了start_element、end_element和char_data这三个属性,而且以下这三行代码有何用:parser.StartElementHandler=handler.start_elementparser.EndElementHandler=handler.end_elementparser.CharacterDataHandler=handler.char_data想了好久了,求各位不吝赐教
2 回答

红颜莎娜
TA贡献1842条经验 获得超12个赞
DefaultSaxHandler是没有继承自DefaultHandler,如果继承了,它内部定义的start_element、end_element、char_data就是overwrite,如果没有继承,则是属于自定义,这点没有异议吧。关键不在于它是否继承,而是在于parser是否定义了这几个函数并实现了对应的处理函数,而DefaultSaxHandler中定义的几个函数相当于回调函数,在这里并不要求它是否继承自DefaultHandler。下面是一个非常简单的例子,目标是寻找"<"和">"中间的内容,当然,这个为了简单说明怎么work的,状态机跟XML的sax解析还是有些不同的。SAX的parser的工作原理基本上类似于此,但是效率肯定比下面这个版本高,内部的状态机也比下面这个复杂,仅供参考。classMyParser(object):def__init__(self):self.findValue=Nonedefparse(self,inputString):state_init=-1state_start_elem=0state_end_elem=2element_found=""current_state=state_initforeachCharininputString:ifeachChar=="<"and(state_init==current_stateorstate_end_elem==current_state):current_state=state_start_elemelement_found=""continueelifeachChar==">"and(state_start_elem==current_state):ifself.findValueandcallable(self.findValue):self.findValue(element_found)current_state=state_end_elemelse:element_found+=eachCharclassMyHandler(object):defHaveFindAValue(self,valueName):print"wehavefoundavalue"+valueNamea=MyHandler()parser=MyParser()parser.findValue=a.HaveFindAValueparser.parse("hello ") 输出wehavefoundavalueXMLwehavefoundavalueXML2
添加回答
举报
0/150
提交
取消