猿问

python:SAX解析XML

fromxml.parsers.expatimportParserCreate
classDefaultSaxHandler(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'''
  1. Python
  2. Ruby
'''
handler=DefaultSaxHandler()
parser=ParserCreate()
parser.returns_unicode=True
parser.StartElementHandler=handler.start_element
parser.EndElementHandler=handler.end_element
parser.CharacterDataHandler=handler.char_data
parser.Parse(xml)
这段代码中DefaultSaxHandler类又没有继承DefaultHandler,它的实例handler怎么多了start_element、end_element和char_data这三个属性,而且以下这三行代码有何用:
parser.StartElementHandler=handler.start_element
parser.EndElementHandler=handler.end_element
parser.CharacterDataHandler=handler.char_data
想了好久了,求各位不吝赐教
慕莱坞森
浏览 834回答 2
2回答

红颜莎娜

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_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
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答