@darkelephant

Как получить все ошибки несоответствия xml файла xsd схеме?

Озадачился проверкой xml файла своей xsd схеме. Для этой цели использую python c модулем lxml. Код следующий:
import os
import sys
import datetime
from lxml import etree

rootDir = os.path.dirname(sys.argv[0])
scheme = '{}\\{}'.format(rootDir,'ListForRating_v03\ListForRating_v03.xsd')
pathToXML = '{}\\{}'.format(rootDir,'xml')

class Validator:

  def __init__(self, xsd_path: str):
    xmlschema_doc = etree.parse(xsd_path)
    self.xmlschema = etree.XMLSchema(xmlschema_doc)

  def validate(self, xml_path: str) -> str:
    xml_doc = etree.parse(xml_path)
    #result = self.xmlschema.validate(xml_doc)
    try:
      self.xmlschema.assert_(xml_doc)
      return 'Valid! :)'
    except AssertionError as e:
      print(str(e))
    return 'Not valid! :('

validator = Validator(scheme)


Files = os.listdir(pathToXML)
t = 'files' if len(Files) > 1 else 'file'
print('Scanning %s %s' % (len(Files), t))
timeBegin = datetime.datetime.now()
for file_name in Files:
  print('{}: '.format(file_name), end='')
  file_path = '{}\\{}'.format(pathToXML, file_name)
  print(validator.validate(file_path))
timeEnd = datetime.datetime.now()
delta = timeEnd - timeBegin
print('Scanning complete. Total time: {} seconds'.format(delta.seconds))

Собственно все отрабатывает корректно, кроме одного. Как только находится первое несоответствие схеме на этом все заканчивается. А мне надо, чтобы были отображены все ошибки, какие есть в xml файле. Как, например, сделано в плагине xml tools для notepad++. Подскажите, пожалуйста, что поправить в коде для получения всех ошибок?
Заранее спасибо.
  • Вопрос задан
  • 970 просмотров
Решения вопроса 1
@darkelephant Автор вопроса
Дмитрий, спасибо за ссылку. Разобрался и допилил функционал, как хотел. Привожу код, возможно кому-нибудь пригодится
import os
import sys
import datetime
from lxml import etree

rootDir = os.path.dirname(sys.argv[0])
scheme = '{}\\{}'.format(rootDir, 'ListForRating_v03\ListForRating_v03.xsd')
pathToXML = '{}\\{}'.format(rootDir, 'xml')


class Validator:

    def __init__(self, xsd_path: str):
        xmlschema_doc = etree.parse(xsd_path)
        self.xmlschema = etree.XMLSchema(xmlschema_doc)

    def validate(self, xml_path: str) -> str:
        xml_doc = etree.parse(xml_path)
        try:
            self.xmlschema.assertValid(xml_doc)
            return 'Valid! :)'
        except etree.DocumentInvalid as e:
            msg = 'Not valid! :( Errors save in errors.log:'
            with open('errors.log', 'a') as f:
                for error in self.xmlschema.error_log:
                    f.write('File name: {} Error: {} Line: {}.\n'.format(os.path.basename(xml_path), error.message, error.line))
            return msg

validator = Validator(scheme)

Files = os.listdir(pathToXML)
t = 'files' if len(Files) > 1 else 'file'
print('Scanning %s %s' % (len(Files), t))
timeBegin = datetime.datetime.now()
for file_name in Files:
    print('{}: '.format(file_name), end='')
    file_path = '{}\\{}'.format(pathToXML, file_name)
    print(validator.validate(file_path))
timeEnd = datetime.datetime.now()
delta = timeEnd - timeBegin
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы