2013-07-23 69 views
17

我有一個XML文件,並且我有一個XML模式。我想根據該模式驗證文件並檢查它是否符合該模式。我正在使用python,但如果在python中沒有這樣有用的庫,我可以對任何語言開放。針對模式的XML(.xsd)供稿驗證

這裏我最好的選擇是什麼?我會擔心我能以多快的速度啓動並運行。

回答

21

當然lxml

定義一個XMLParser預定義模式,加載文件fromstring()和捕捉任何XML架構錯誤:

from lxml import etree 

def validate(xmlparser, xmlfilename): 
    try: 
     with open(xmlfilename, 'r') as f: 
      etree.fromstring(f.read(), xmlparser) 
     return True 
    except etree.XMLSchemaError: 
     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 = ['input1.xml', 'input2.xml', 'input3.xml'] 
for filename in filenames: 
    if validate(xmlparser, filename): 
     print "%s validates" % filename 
    else: 
     print "%s doesn't validate" % filename 
+0

它確實有效,是的。有關於它的簡要教程?我傳遞了模式和提要文件,並將它們都處理並處理了它們。我如何知道它是否得到驗證? – Scooby

+0

很簡單。如果xml文件不驗證,'etree.fromstring'將會引發異常。 – alecxe

+0

哇,那很快。現在的事情是我想讀取多個XML提要並根據模式驗證它們。所以我可以通過fromString來循環它們? 1.如果發生異常,它會停止處理並忽略其他提要?我想要處理所有的提要文件,然後如果可能的話給出一個錯誤,說明它在失敗或未驗證的地方。 2.此外,它的feed可能有很多記錄,是否有任何方法可以運行所有這些記錄,並在通過或未通過驗證的基礎上對它們進行劃分。 – Scooby

1

蟒蛇片段是好,但更好的方法是使用xmllint:

xmllint -schema sample.xsd --noout sample.xml 
+0

剛剛發現這個谷歌搜索同樣的問題 - 我喜歡這個安裝另一個XML庫(我正在使用內置的xml.etree模塊來生成XML)。 – nrlakin