如何使用Python库验证XML文件时出现多个错误?
我有一些XML文件要验证,我必须用Python来验证。我试着用XSD和lxml验证它。但我只得到一个首先发生的错误,但我需要XML文件中的所有错误和不匹配。有什么方法可以让我用lxml获取所有错误的列表吗?或者还有其他Python解决方案吗?您可以 要了解如何执行如何使用Python库验证XML文件时出现多个错误?,python,xml,validation,error-handling,lxml,Python,Xml,Validation,Error Handling,Lxml,我有一些XML文件要验证,我必须用Python来验证。我试着用XSD和lxml验证它。但我只得到一个首先发生的错误,但我需要XML文件中的所有错误和不匹配。有什么方法可以让我用lxml获取所有错误的列表吗?或者还有其他Python解决方案吗?您可以 要了解如何执行try/except设计模式,您可以在except部分存储不匹配项(例如,一个列表或对列表),然后从第一个错误后的点再次递归地try/except。如果描述不够详细,请告诉我 干杯 解决这个问题的方法是: 可能有更好的方法来解决这个问题
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))
使用
lxml
,您可以迭代error\u log
并打印每个错误的行号和错误消息:
def validate_with_lxml(xsd_树、xml_树):
schema=lxml.etree.XMLSchema(xsd_树)
尝试:
schema.assertValid(xml_树)
除了lxml.etree.document无效:
打印(“验证错误:”)
对于schema.error\u日志中的错误:
打印(“行{}:{}”。格式(error.Line,error.message))
使用库,您可以使用iter\u错误
方法:
下面是我的代码(Python 3):
对不起,我不明白。这两位代码如何组合在一起?什么是elem_树?有人能提供一个完整的工作代码示例吗?谢谢-罗文
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))
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}')