先說說需求,因為和客戶合作,對方要求按規定的XML格式(通過XML Schema)來提供資料。本身XML驗證沒什麼問題的,但是當XML的檔案很大時,我們現在是100M左右。你如何去確認產生的XML是否符合XSD檔案的定義呢。用人眼睛去看,這可是幾十萬條資料,肯定只能通過XML自身的驗證機制來處理了。
XML的格式驗證方法就這幾個,如果你的檔案只有幾M,這個可以通過XMLSPY、XMLPAD,這些工具都可以驗證。但這個100M的檔案,這些工具都沒辦法開啟。
對方公司是linux的,linux有xmllint –schema *.xsd *.xml > /dev/null 可以用來驗證。鬱悶的是我用Windows,沒辦法就只能自己寫代碼了。
發現Python2.5沒有庫支援XML Schema。只能找第三方的,最後找到的就是這個lxml(辛苦的,花了兩天時間折騰這個)
1:http://codespeak.net/lxml/
2:直接提供驗代碼:
#!/usr/bin/env python
#coding=gb2312
from lxml import etree
import timeit
def CheckXML():
xmlschema_doc = etree.parse(”local_feed.xsd.xml”)
xmlschema = etree.XMLSchema(xmlschema_doc)
doc = etree.parse(”google-local0.xml”)
print xmlschema.validate(doc)
print >> open(”log.txt”,”w”), xmlschema.error_log
if __name__ ==’__main__’:
print ’start…’
t = timeit.Timer(’CheckXML()’,'from __main__ import CheckXML’)
print t.repeat(1,1)
print ‘end. any key exit…’
input()
Tips:
- timeit 傳說中的Python自備電池。但覺得有些不是很好用,下次再具體說一下。
- print >> 輸出重新導向。很方便直接將錯誤儲存成檔案
- 還有就是lxml的這個Module的使用啦。這個module貌似比較強大。python官方的下載也是最高的,以後再進一步學習吧。
- 用C#也寫了一個同樣的,發現C#大概不到60s,但lxml的方式要133s,liunx沒具體統計,但也慢的。這裡只是說一下實際情況,不討論原因。