8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何使用 Python 库验证 XML 文件时获取多个错误?

TriNguyen 2月前

46 0

我有一些要验证的 XML 文件,我必须使用 Python 进行验证。我尝试使用 lxml 的 XSD 对其进行验证。但我只收到一个首先发生的错误,但我需要所有错误和不匹配...

我有一些要验证的 XML 文件,我必须使用 Python 来验证。我尝试使用 lxml 的 XSD 来验证它。但我只得到一个错误,它首先发生,但我需要 XML 文件中的所有错误和不匹配。有什么方法可以设法使用 lxml 获取所有错误的列表吗?或者还有其他 Python 解决方案吗?

帖子版权声明 1、本帖标题:如何使用 Python 库验证 XML 文件时获取多个错误?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由TriNguyen在本站《validation》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 解决这个问题的方法是:

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

    也许有更好的方法来解决这个问题:)

  • 使用 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))
    
  • 使用 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}')
    
  • 您可以 阅读 Python 文档中的“错误异常” 以了解如何进行 try/except 设计模式,并在 except 其中存储不匹配项(例如,列表或成对列表),然后 try/except 之后的 位置开始再次 。如果描述不够详细,请告诉我。

    干杯!

  • 由于几个错误,提供的解决方案不再起作用。在 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)) 
    
  • 抱歉,我不明白这一点。这两段代码如何组合在一起?什么是 elem_tree?有人可以提供一个完整的工作代码示例吗?谢谢 - Rowan

  • 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
    
返回
作者最近主题: