为了账号安全,请及时绑定邮箱和手机立即绑定

python:SAX解析XML

python:SAX解析XML

慕莱坞森 2019-04-16 17:02:51
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=None
defparse(self,inputString):
state_init=-1
state_start_elem=0
state_end_elem=2
element_found=""
current_state=state_init
foreachCharininputString:
ifeachChar=="<"and(state_init==current_stateorstate_end_elem==current_state):
current_state=state_start_elem
element_found=""
continue
elifeachChar==">"and(state_start_elem==current_state):
ifself.findValueandcallable(self.findValue):
self.findValue(element_found)
current_state=state_end_elem
else:
element_found+=eachChar
classMyHandler(object):
defHaveFindAValue(self,valueName):
print"wehavefoundavalue"+valueName
a=MyHandler()
parser=MyParser()
parser.findValue=a.HaveFindAValue
parser.parse("hello")
输出
wehavefoundavalueXML
wehavefoundavalueXML2
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 833 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号