第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python:SAX解析XML

python:SAX解析XML

陪伴而非守候 2019-04-07 11:18:45
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 回答

?
慕運(yùn)維8079593

TA貢獻(xiàn)1876條經(jīng)驗 獲得超5個贊

DefaultSaxHandler是沒有繼承自DefaultHandler,如果繼承了,它內(nèi)部定義的start_element、end_element、char_data就是overwrite,如果沒有繼承,則是屬于自定義,這點(diǎn)沒有異議吧。關(guān)鍵不在于它是否繼承,而是在于parser是否定義了這幾個函數(shù)并實現(xiàn)了對應(yīng)的處理函數(shù),而DefaultSaxHandler中定義的幾個函數(shù)相當(dāng)于回調(diào)函數(shù),在這里并不要求它是否繼承自DefaultHandler。
下面是一個非常簡單的例子,目標(biāo)是尋找"<"和">"中間的內(nèi)容,當(dāng)然,這個為了簡單說明怎么work的,狀態(tài)機(jī)跟XML的sax解析還是有些不同的。SAX的parser的工作原理基本上類似于此,但是效率肯定比下面這個版本高,內(nèi)部的狀態(tài)機(jī)也比下面這個復(fù)雜,僅供參考。
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
                            
查看完整回答
反對 回復(fù) 2019-04-07
  • 2 回答
  • 0 關(guān)注
  • 373 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號