有關(guān)Python 2.0 XML問(wèn)題全解析
在Python中將Python 2.0 XML 與一些規(guī)則表達(dá)式比較”樣式通常不能很好地適合對(duì) XML 進(jìn)行徹底語(yǔ)法分析和處理,Python不僅有處理復(fù)雜數(shù)據(jù)結(jié)構(gòu)的直接方法,還有一系列 XML 相關(guān)的模塊可以幫助語(yǔ)法分析、處理和生成 XML。
XML-SIG (專門(mén)興趣組)的成員為維護(hù) Python 一系列 XML 工具做了許多工作。與其它 Python 專門(mén)興趣組一樣,XML-SIG 要維護(hù)郵件發(fā)送列表、列表檔案、有用的參考大全、文檔、標(biāo)準(zhǔn)包和其它資源(請(qǐng)參閱本文后的參考資料)。
從 Python 2.0 開(kāi)始,Python 在其標(biāo)準(zhǔn)發(fā)行版中包括大多數(shù) XML-SIG 項(xiàng)目。最新的 XML-SIG 包可能包含一些 Python 標(biāo)準(zhǔn)發(fā)行版中沒(méi)有的“極端先進(jìn)”特性,但出于面向絕大多數(shù)人的目的
-- 包括本文中的討論 Python 2.0 XML 支持將是您感興趣的。幸運(yùn)的是,早期 Python 版本對(duì) xmllib 的基本支持在 Python 2.0+ 下有了很大進(jìn)步。目前,Python 用戶能正常的選擇。
DOM、SAX 和 expat 技術(shù)來(lái)處理 XML (使用其他編程語(yǔ)言的 XML 開(kāi)發(fā)人員將會(huì)意識(shí)到這些)。xmllib 是一個(gè)非驗(yàn)證的低級(jí)語(yǔ)法分析器。應(yīng)用程序員使用的 xmllib 可以覆蓋 XMLParser 類,并提供處理文檔元素(如特定或類屬標(biāo)記,或字符實(shí)體)的方法。
從 Python 1.5x 到 Python 2.0+ 以來(lái),xmllib 的使用方法并沒(méi)變化;在絕大多數(shù)情況下更好的選擇是使用 SAX 技術(shù),它也是種面向流的技術(shù),對(duì)語(yǔ)言和開(kāi)發(fā)者來(lái)說(shuō)更為標(biāo)準(zhǔn)。本文中的示例與原來(lái)專欄中的相同:包括一個(gè)叫做 quotations.dtd 的 DTD 以及這個(gè) DTD 的文檔sample.xml (請(qǐng)參閱參考資料,以獲取本文中提到的文件的檔案)。
以下的代碼顯示了 sample.xml 中每段引言的前幾行,并生成了非常簡(jiǎn)單的未知標(biāo)記和實(shí)體的 ASCII 指示符。經(jīng)過(guò)分析的文本作為連續(xù)流來(lái)處理,所使用的任何累加器都由程序員負(fù)責(zé)(如標(biāo)記中的字符串 (#PCDATA),或所遇到的標(biāo)記的列表或詞典)。
- classQuotationHandler(ContentHandler):
- """Crude extractor for quotations.dtd compliant XML document"""
- def__init__(self):
- self.in_quote = 0
- self.thisquote = ''
- defstartDocument(self):
- print '--- Begin Document ---'
- defstartElement(self, name, attrs):
- if name == 'quotation':
- print 'QUOTATION:'
- self.in_quote = 1
- else:
- selfself.thisquote = self.thisquote + '{'
- defendElement(self, name):
- if name == 'quotation':
- print string.join(string.split(self.thisquote[:230]))+'...',
- print '('+str(len(self.thisquote))+' bytes)'
- self.thisquote = ''
- self.in_quote = 0
- else:
您可能需要展望標(biāo)準(zhǔn) XML 支持的未來(lái)的原因是,在進(jìn)行語(yǔ)法分析的同時(shí)需要進(jìn)行驗(yàn)證。不幸的是,標(biāo)準(zhǔn) Python 2.0 XML 包并不包括驗(yàn)證型語(yǔ)法分析器。xmlproc 是 python 原有的語(yǔ)法分析器,它執(zhí)行幾乎完整的驗(yàn)證。如果需要驗(yàn)證型語(yǔ)法分析器, xmlproc 是 Python 2.0 XML 當(dāng)前唯一的選擇。而且,xmlproc 提供其它語(yǔ)法分析器所不具備的各種高級(jí)和測(cè)試接口。
您可以直接導(dǎo)入 xml.parsers.expat。如果這樣做,您就能獲得 SAX 界面并不提供的一些特殊技巧。這樣,xml.parsers.expat 與 SAX 相比有些“低級(jí)”。但 SAX 技術(shù)非常標(biāo)準(zhǔn),對(duì)面向流的處理也非常好;
大多數(shù)情況下 SAX 的級(jí)別正合適。通常情況下,由于 make_parser() 函數(shù)已經(jīng)能獲得 expat 提供的性能,因此純速度的差異很小,DOM 可以用于修改 XML 文檔,因?yàn)榭梢詣?chuàng)建一棵 DOM 樹(shù)。
通過(guò)添加新節(jié)點(diǎn)和來(lái)回移動(dòng)子樹(shù)來(lái)修改這棵樹(shù),然后生成一個(gè)新的 XML 文檔作為輸出。您也可以自己構(gòu)造一棵 DOM 樹(shù),然后將它轉(zhuǎn)換成 XML;用這種方法生成 XML 輸出比僅將 <tag1>...</tag1> 寫(xiě)入文件的方法更靈活。
【編輯推薦】






