3

検証したいXMLファイルがあり、Pythonで実行する必要があります。私はlxmlを使用したXSDでそれを検証しようとしました。しかし、最初に発生するエラーは1つだけですが、XMLファイルのすべてのエラーと不一致が必要です。lxmlですべてのエラーのリストを取得する方法はありますか?または、他のPythonソリューションはありますか?

4

6 に答える 6

6

この問題を解決する方法は次のとおりです。

try:
    xmlschema.assertValid(xml_to_validate)
except etree.DocumentInvalid, xml_errors:
    pass
print "List of errors:\r\n", xml_errors.error_log

この問題を解決するためのより良い方法があるかもしれません:)

于 2012-07-23T11:18:58.373 に答える
2

を使用すると、エラーごとに行番号とエラーメッセージをlxml繰り返して出力できます。error_log

def validate_with_lxml(xsd_tree, xml_tree):
    schema = lxml.etree.XMLSchema(xsd_tree)
    try:
        schema.assertValid(xml_tree)
    except lxml.etree.DocumentInvalid:
        print("Validation error(s):")
        for error in schema.error_log:
            print("  Line {}: {}".format(error.line, error.message))
于 2019-06-26T17:03:21.130 に答える
2

XMLSchemaライブラリを使用すると、次のiter_errors方法に頼ることができます:https ://xmlschema.readthedocs.io/en/latest/api.html?highlight=iter_errors#xmlschema.XMLSchemaBase.iter_errors

ここに私のコード(Python 3):

def get_validation_errors(xml_file, xsd_uri='example.xsd'):
    xml_string = xml_file.read().decode('utf-8')
    dir_path = os.path.dirname(os.path.realpath(__file__))
    xsd_path = os.path.join(dir_path, xsd_uri)
    schema = xmlschema.XMLSchema(xsd_path)
    validation_error_iterator = schema.iter_errors(xml_string)
    for idx, validation_error in enumerate(validation_error_iterator, start=1):
        print(f'[{idx}] path: {validation_error.path} | reason: {validation_error.reason}')
于 2020-10-18T18:36:35.263 に答える
1

エラー例外に関するPythonのドキュメントを読んでtry/exceptデザインパターンを実行する方法を見つけることexceptができます。また、一部では、不一致(リスト、またはペアのリストなど)を格納してから、その後のポイントから再帰的try/except再開することができます。最初のエラー。それが十分に説明的でない場合は私に知らせてください。

乾杯!

于 2012-07-20T18:28:17.857 に答える
0

提供されたソリューションは、いくつかのエラーのために機能しなくなりました。xmlschemaにassertValidを適用する前に、次のように指定する必要があります。

try:
   xmlschema_doc = lxml.etree.parse(filename)
   xmlschema = lxml.etree.XMLSchema(xmlschema_doc)
   xmlschema.assertValid(elem_tree)
except lxml.etree.ParseError as e:
   raise lxml.etree.ParserError(str(e))
except lxml.etree.DocumentInvalid as e:
   if ignore_errors:
    raise lxml.etree.ValidationError("The Config tree is invalid with error 
       message:\n\n" + str(e)) 
于 2018-06-29T11:18:23.423 に答える
0
def get_validation_errors(xml_file, xsd_file):
    schema = xmlschema.XMLSchema(xsd_file)
    validation_error_iterator = schema.iter_errors(xml_file)
    errors = list()
    for idx, validation_error in enumerate(validation_error_iterator, start=1):
        errors.append(validation_error.__str__())
        print(
            f'[{idx}] path: {validation_error.path} | reason: {validation_error.reason} | message: {validation_error.message}')
    return errors
于 2021-06-23T07:25:07.697 に答える