2013-07-23 22 views
17

私はXMLファイルを持っており、XMLスキーマを持っています。私は、そのスキーマに対してファイルを検証し、そのスキーマに従っているかどうか確認したいと思います。私はPythonを使用していますが、そのような有用なライブラリがPythonにない場合は、その問題のために任意の言語に対応しています。スキーマに対するXML(.xsd)フィード検証

私の最高のオプションは何ですか?私はこれをいかに速く動かすことができるか心配しています。

答えて

21

間違いなくlxml

、事前に定義されたスキーマでXMLParserの定義ファイルfromstring()をロードして、任意のXML Schemaエラーをキャッチ:

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

それは簡単です。 'etree.fromstring'は、xmlファイルが検証されないと例外をスローします。 – alecxe

+0

うわー、それは速かった。今は、複数のXMLフィードを読み込み、スキーマに対して検証する必要があります。だから私はそれをループからループすることができますか? 1.処理を停止して他のフィードを無視する例外はありますか?私はすべてのフィードファイルを処理し、可能であれば、それがどこで失敗したか、または検証しなかったかについてのエラーを出したいでしょう。 2.フィードには多くのレコードが含まれている可能性があります。すべてのレコードを実行し、検証の合否に基づいてレコードを分割する方法はありますか。 – Scooby

1

Pythonのスニペットが良いですが、選択肢はxmllintを使用することです:

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

これは同じ問題でグーグルが見つかりました - 私は別のXMLライブラリ私は組み込みのxml.etreeモジュールを使用してXMLを生成しています)。 – nrlakin

関連する問題