aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xmlValidator/xmlValidator.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/xmlValidator/xmlValidator.py')
-rwxr-xr-xtools/xmlValidator/xmlValidator.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/tools/xmlValidator/xmlValidator.py b/tools/xmlValidator/xmlValidator.py
new file mode 100755
index 0000000..ccf4bd0
--- /dev/null
+++ b/tools/xmlValidator/xmlValidator.py
@@ -0,0 +1,109 @@
+#! /usr/bin/python
+
+# Copyright (c) 2014, Intel Corporation
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation and/or
+# other materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its contributors
+# may be used to endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from lxml import etree
+from os import path
+from os import walk
+from sys import argv
+
+class PrintColor():
+ @staticmethod
+ def success(stringToPrint):
+ green=32
+ PrintColor._printColor(green, stringToPrint)
+
+ @staticmethod
+ def error(stringToPrint):
+ red=31
+ PrintColor._printColor(red, stringToPrint)
+
+ @staticmethod
+ def _printColor(color, stringToPrint):
+ """prints strings in color via ascii escape sequence"""
+ print("\033[%sm%s\033[0m" % (str(color), stringToPrint))
+
+def getSchemaFilenameFromXmlFile(xmlFilePath):
+ """getSchemaFileNameFromXmlFile
+
+ The pfw considers that the .xsd file has the same name as the
+ root element name of the .xml.
+ With of this knowledge, we may easily find the
+ schema file we need.
+
+ Args:
+ xmlFilePath: the xml file.
+
+ Returns:
+ str: the corresponding .schema name
+ """
+ xmlTree = etree.parse(xmlFilePath)
+ rootElement = xmlTree.getroot()
+ return rootElement.tag + '.xsd'
+
+def validateXmlWithSchema(xmlFilePath, schemaFilePath):
+ """validateXmlWithSchema
+
+ Validates an .xml file based on his corresponding schema.
+
+ Args:
+ xmlFilePath (str): the absolute path to the xml file.
+ schemaFilePath (str): the absolute path to the schema.
+ """
+ baseXmlName = path.basename(xmlFilePath)
+ baseSchemaName = path.basename(schemaFilePath)
+ print 'Attempt to validate', baseXmlName, 'with', baseSchemaName
+
+ schemaContent = etree.parse(schemaFilePath)
+ schema = etree.XMLSchema(schemaContent)
+ xmlContent = etree.parse(xmlFilePath)
+ xmlContent.xinclude()
+
+ if schema.validate(xmlContent):
+ PrintColor.success('%s is valid' % str(baseXmlName))
+ else:
+ PrintColor.error('Error: %s' % str(schema.error_log))
+
+# handle main arguments
+if len(argv) != 3:
+ PrintColor.error('Error: usage %s xmlDirectory schemaDirectory' % str(argv[0]))
+ exit(1)
+
+xmlDirectory = argv[1]
+schemaDirectory = argv[2]
+
+print('[*] Validate xml files in %s with %s' % (xmlDirectory, schemaDirectory))
+
+for rootPath, _, files in walk(xmlDirectory):
+ for filename in files:
+ if filename.endswith('.xml'):
+ xmlFilePath = path.join(rootPath, filename)
+ schemaFileName = getSchemaFilenameFromXmlFile(xmlFilePath)
+ schemaFilePath = path.join(schemaDirectory, schemaFileName)
+ validateXmlWithSchema(xmlFilePath, schemaFilePath)