2013-07-30 39 views
0

我正在使用lxml包(etree)採用xml模式並使用代碼對xml文件進行解析。使用lxml xml模式驗證打印回溯

from lxml import etree 
import traceback 
schema_file = 'C:/Users/Romi/Desktop/XML Testing/schema.xsd' 

def validate(xmlparser, xmlfilename): 
try: 
    with open(xmlfilename, 'r') as f: 
     etree.fromstring(f.read(), xmlparser) 
    return True 
except: 
    return False 

with open(schema_file, 'r') as f: 
schema_root = etree.XML(f.read()) 

schema = etree.XMLSchema(schema_root) 
xmlparser = etree.XMLParser(schema=schema) 

filenames = ['C:/Users/Romi/Desktop/XML Testing/feed.xml','C:/Users/Romi/Desktop/XML   Testing/feed1.xml' ] 
fo = open("C:/Users/Romi/Desktop/XML Testing/result.txt", "r+") 
for filename in filenames: 
if validate(xmlparser, filename): 
    print "%s validates with the schema." % filename 
    #fo.write("%s validates with the schema." % filename) 
else: 
    print "%s doesn't validate with the schema." % filename 
    #fo.write("%s doesn't validate with the schema." % filename) 

我打印錯誤時它不只會驗證,但我想打印一個指向它失敗究竟給錯誤和移動到下一個文件進行驗證整個回溯。

任何指針?

回答

2

您可以使用回溯庫在你的異常打印出堆棧跟蹤捕獲:

http://docs.python.org/2/library/traceback.html#traceback-examples

順便說一句,這是一個很好的做法,限制你的異常處理。我會改變它,所以它只捕獲lxml解析錯誤 - 例如,如果open()失敗,那麼validate()函數將返回False。

沿此線的東西:

try: 
    with open(xmlfilename, 'r') as f: 
    return etree.fromstring(f.read(), xmlparser) 
except etree.XMLSyntaxError: 
    print traceback.format_exc() 

希望幫助!

+1

工程就像一個魅力!也會記住你的限制追溯! – Scooby

+0

太棒了!很高興。 –