Commit 6482e2db authored by canterburym's avatar canterburym

Updated XSD checking

parent ba83afab
Pipeline #3142 passed with stage
in 10 seconds
...@@ -70,7 +70,7 @@ def validateAllASN1FilesInPath (path): ...@@ -70,7 +70,7 @@ def validateAllASN1FilesInPath (path):
if __name__ == '__main__': if __name__ == '__main__':
parseErrors, compileErrors = validateAllASN1FilesInPath("./") parseErrors, compileErrors = validateAllASN1FilesInPath("./")
parseErrorCount = 0 parseErrorCount = 0
print ("Parser checks:") print ("ASN.1 Parser checks:")
print ("-----------------------------") print ("-----------------------------")
for filename, errors in parseErrors.items(): for filename, errors in parseErrors.items():
if len(errors) > 0: if len(errors) > 0:
...@@ -81,7 +81,7 @@ if __name__ == '__main__': ...@@ -81,7 +81,7 @@ if __name__ == '__main__':
else: else:
print (f"{filename}: OK") print (f"{filename}: OK")
print ("-----------------------------") print ("-----------------------------")
print ("Compilation:") print ("ASN.1 Compilation:")
print ("-----------------------------") print ("-----------------------------")
if len(compileErrors) > 0: if len(compileErrors) > 0:
for error in compileErrors: for error in compileErrors:
......
import logging
logging.basicConfig(format="[%(levelname)s] %(message)s", level=logging.INFO)
import glob import glob
import sys import sys
from pathlib import Path from pathlib import Path
from pprint import pprint from pprint import pprint
if __name__ == '__main__': from lxml import etree
from xml.etree.ElementTree import ParseError
from xmlschema import XMLSchema, XMLSchemaParseError
def BuildSchemaDictonary (fileList):
if len(fileList) == 0:
logging.info("No schema files provided")
return []
logging.info("Schema locations:")
schemaLocations = []
for schemaFile in fileList:
try:
xs = XMLSchema(schemaFile, validation='skip')
schemaLocations.append((xs.default_namespace, str(Path(schemaFile).resolve())))
logging.info(" [ {0} -> {1} ]".format(xs.default_namespace, schemaFile))
except ParseError as ex:
logging.warning (" [ {0} failed to parse: {1} ]".format(schemaFile, ex))
return schemaLocations
def BuildSchema (coreFile, fileList = None):
schemaLocations = []
if fileList and len(fileList) > 0:
schemaLocations = BuildSchemaDictonary(fileList)
coreSchema = XMLSchema(str(Path(coreFile)), locations=schemaLocations)
return coreSchema
if sys.version_info <= (3, 5):
sys.exit('ERROR: You need at least Python 3.5 to run this tool')
try: def ValidateXSDFiles (fileList):
from lxml import etree if len(fileList) == 0:
except ImportError: logging.info("No schema files provided")
sys.exit('ERROR: You need to install the Python lxml library') return {}
schemaLocations = BuildSchemaDictonary(fileList)
errors = {}
try: logging.info("Schema validation:")
import xmlschema for schemaFile in fileList:
except ImportError: try:
sys.exit('ERROR: You need to install the xml schema library') schema = XMLSchema(schemaFile, locations = schemaLocations)
logging.info(schemaFile + ": OK")
errors[schemaFile] = []
except XMLSchemaParseError as ex:
logging.warning(schemaFile + ": Failed validation ({0})".format(ex.message))
if (ex.schema_url) and (ex.schema_url != ex.origin_url):
logging.warning(" Error comes from {0}, suppressing".format(ex.schema_url))
else:
errors[schemaFile] = [ex]
return errors
schemaFiles = glob.glob('*.xsd') def ValidateAllXSDFilesInPath (path):
globPattern = str(Path(path)) + '/*.xsd'
logging.info("Searching: " + globPattern)
schemaGlob = glob.glob(globPattern, recursive=True)
return ValidateXSDFiles(schemaGlob)
def ValidateInstanceDocuments (coreFile, supportingSchemas, instanceDocs):
if (instanceDocs is None) or len(instanceDocs) == 0:
logging.warning ("No instance documents provided")
return []
schema = BuildSchema(coreFile, supportingSchemas)
errors = []
for instanceDoc in instanceDocs:
try:
schema.validate(instanceDoc)
logging.info ("{0} passed validation".format(instanceDoc))
except Exception as ex:
logging.error ("{0} failed validation: {1}".format(instanceDoc, ex))
return errors
if __name__ == '__main__':
results = ValidateAllXSDFilesInPath("./")
for schemaFile in schemaFiles: print ("XSD validation checks:")
print("Checking file: {0}".format(schemaFile), end="") print ("-----------------------------")
xs = xmlschema.XMLSchema(schemaFile) errorCount = 0
print(" OK") for fileName, errors in results.items():
if len(errors) > 0:
errorCount += len(errors)
print (f" {fileName}: {len(errors)} errors")
for error in errors:
if isinstance(error, XMLSchemaParseError):
print (error.msg)
else:
print (f" {str(error)}")
else:
print (f" {fileName}: OK")
print ("{0} XSD schemas checked".format(len(schemaFiles))) print ("-----------------------------")
\ No newline at end of file print (f"{errorCount} errors detected")
exit(errorCount)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment