web-dev-qa-db-ja.com

スキーマに対するXML(.xsd)フィードの検証

XMLファイルとXMLスキーマがあります。そのスキーマに対してファイルを検証し、それが準拠しているかどうかを確認したいと思います。私はpythonを使用していますが、Pythonにそのような便利なライブラリがない場合は、どの言語でも使用できます。

ここでの私の最善の選択肢は何でしょうか?私はこれをどれだけ速く立ち上げて実行できるか心配します。

18
Scooby

間違いなく 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

schema_file = 'schema.xsd'
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)
_

エンコーディングに関する注意

スキーマファイルにエンコード付きのxmlタグが含まれている場合(例:_<?xml version="1.0" encoding="UTF-8"?>_)、上記のコードは次のエラーを生成します。

_Traceback (most recent call last):
  File "<input>", line 2, in <module>
    schema_root = etree.XML(f.read())
  File "src/lxml/etree.pyx", line 3192, in lxml.etree.XML
  File "src/lxml/parser.pxi", line 1872, in lxml.etree._parseMemoryDocument
ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
_

解決策 ファイルをバイトモードで開くことです:open(..., 'rb')

_[...]
def validate(xmlparser, xmlfilename):
    try:
        with open(xmlfilename, 'rb') as f:
[...]
with open(schema_file, 'rb') as f:
[...]
_
25
alecxe

pythonスニペットは適切ですが、代わりにxmllintを使用することもできます。

xmllint -schema sample.xsd --noout sample.xml
2
typelogic