diff -r aaa80b48bead -r dcfe7c07ba1c minixsv/xsvalSchema.py --- a/minixsv/xsvalSchema.py Tue Jan 22 10:57:41 2008 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,176 +0,0 @@ -# -# minixsv, Release 0.3 -# file: xsvalSchema.py -# -# Derived validator class (for validation of schema files) -# -# history: -# 2004-10-07 rl created -# -# Copyright (c) 2004 by Roland Leuthe. All rights reserved. -# -# -------------------------------------------------------------------- -# The minixsv XML schema validator is -# -# Copyright (c) 2004 by Roland Leuthe -# -# By obtaining, using, and/or copying this software and/or its -# associated documentation, you agree that you have read, understood, -# and will comply with the following terms and conditions: -# -# Permission to use, copy, modify, and distribute this software and -# its associated documentation for any purpose and without fee is -# hereby granted, provided that the above copyright notice appears in -# all copies, and that both that copyright notice and this permission -# notice appear in supporting documentation, and that the name of -# the author not be used in advertising or publicity -# pertaining to distribution of the software without specific, written -# prior permission. -# -# THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -# TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- -# ABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR -# BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY -# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE -# OF THIS SOFTWARE. -# -------------------------------------------------------------------- - -from xsvalErrorHandler import * -from xsvalBase import XsValBase - -########################################################### -# Derived validator class for validating one input schema file against the XML rules file - -class XsValSchema (XsValBase): - - ######################################## - # overloaded validate method - # - def validate (self, inputTree, xsdTree): - XsValBase.validate(self, inputTree, xsdTree) - self._checkSchemaSecondLevel() - - - ######################################## - # additional checks for schema files which are not covered by "xsStructs.xsd" - # - def _checkSchemaSecondLevel(self): - self._checkElementNodesSecondLevel() - self._checkGroupNodesSecondLevel() - self._checkAttrGroupNodesSecondLevel() - self._checkAttributeNodesSecondLevel() - - self._checkSimpleTypesSecondLevel() - - - ######################################## - # additional checks for element nodes - # - def _checkElementNodesSecondLevel(self): - self.inputElementDict = {} - for inputNode in self.inputRoot.getChildrenNS(self.inputNSAlias, "element"): - self.inputElementDict[inputNode.getAttribute("name")] = inputNode - - elementNodes = self.inputRoot.getElementsByTagNameNS (self.inputNSAlias, "element") - for elementNode in elementNodes: - if not elementNode.hasAttribute("name") and not elementNode.hasAttribute("ref"): - self._addError ("Element must have 'name' or 'ref' attribute!", elementNode) - continue - - if elementNode.hasAttribute("name") and elementNode.hasAttribute("ref"): - self._addError ("Element must not have 'name' and 'ref' attribute!", elementNode) - continue - - if elementNode.hasAttribute("ref"): - elementRef = self.xmlIf.extractLocalName(elementNode.getAttribute("ref")) - if not self.inputElementDict.has_key(elementRef): - self._addError ("Reference to undefined element '%s'!" %(elementRef), elementNode) - - complexTypeNode = elementNode.getFirstChildNS (self.inputNSAlias, "complexType") - simpleTypeNode = elementNode.getFirstChildNS (self.inputNSAlias, "simpleType") - if elementNode.hasAttribute("type") and (complexTypeNode != None or simpleTypeNode != None): - self._addError ("Element has type attribute and type definition!", elementNode) - if not elementNode.hasAttribute("type") and complexTypeNode == None and simpleTypeNode == None: - self._addWarning ("Element has no type attribute and no type definition!", elementNode) - - minOccurs = elementNode.getAttributeOrDefault("minOccurs", "1") - maxOccurs = elementNode.getAttributeOrDefault("maxOccurs", "1") - if maxOccurs != "unbounded": - if string.atoi(minOccurs) > string.atoi(maxOccurs): - self._addError ("Attribute minOccurs > maxOccurs!", elementNode) - - - ######################################## - # additional checks for group nodes - # - def _checkGroupNodesSecondLevel(self): - self.inputGroupDict = {} - for groupNode in self.inputRoot.getChildrenNS(self.inputNSAlias, "group"): - self.inputGroupDict[groupNode.getAttribute("name")] = groupNode - - groupNodes = self.inputRoot.getElementsByTagNameNS (self.inputNSAlias, "group") - for groupNode in groupNodes: - if groupNode.hasAttribute("ref"): - groupRef = self.xmlIf.extractLocalName(groupNode.getAttribute("ref")) - if not self.inputGroupDict.has_key(groupRef): - self._addError ("Reference to undefined group '%s'!" %(groupRef), groupNode) - - - ######################################## - # additional checks for attributeGroup nodes - # - def _checkAttrGroupNodesSecondLevel(self): - self.inputAttrGroupDict = {} - for attrGroupNode in self.inputRoot.getChildrenNS(self.inputNSAlias, "attrGroup"): - self.inputAttrGroupDict[attrGroupNode.getAttribute("name")] = attrGroupNode - - attrGroupNodes = self.inputRoot.getElementsByTagNameNS (self.inputNSAlias, "attrGroup") - for attrGroupNode in attrGroupNodes: - if attrGroupNode.hasAttribute("ref"): - attrGroupRef = self.xmlIf.extractLocalName(attrGroupNode.getAttribute("ref")) - if not self.inputAttrGroupDict.has_key(attrGroupRef): - self._addError ("Reference to undefined attribute group '%s'!" %(attrGroupRef), attrGroupNode) - - - ######################################## - # additional checks for attribute nodes - # - def _checkAttributeNodesSecondLevel(self): - attributeNodes = self.inputRoot.getElementsByTagNameNS (self.inputNSAlias, "attribute") - for attributeNode in attributeNodes: - if not attributeNode.hasAttribute("name") and not attributeNode.hasAttribute("ref"): - self._addError ("Attribute must have 'name' or 'ref' attribute!", attributeNode) - continue - - if attributeNode.getAttribute("use") == "required" and attributeNode.hasAttribute("default"): - self._addError ("Attribute 'default' is not allowed, because 'use' is 'required'!", attributeNode) - elif attributeNode.hasAttribute("default") and attributeNode.hasAttribute("fixed"): - self._addError ("Attribute must not have 'default' AND 'fixed' attribute!", attributeNode) - - - ######################################## - # additional checks for simple types - # - def _checkSimpleTypesSecondLevel(self): - restrictionNodes, dummy = self.inputRoot.getXPathList (".//simpleType/restriction", self.inputNSAlias) - for restrictionNode in restrictionNodes: - if not restrictionNode.hasAttribute("base") and restrictionNode.getFirstChildNS (self.inputNSAlias, "simpleType") == None: - self._addError ("Simple type restriction must have 'base' attribute or 'simpleType' child tag!", restrictionNode) - - minExcl = restrictionNode.getFirstChildNS(self.inputNSAlias, "minExclusive") - minIncl = restrictionNode.getFirstChildNS(self.inputNSAlias, "minInclusive") - if minExcl != None and minIncl != None: - self._addError ("Restriction attributes 'minExclusive' and 'minInclusive' cannot be defined together!", restrictionNode) - maxExcl = restrictionNode.getFirstChildNS(self.inputNSAlias, "maxExclusive") - maxIncl = restrictionNode.getFirstChildNS(self.inputNSAlias, "maxInclusive") - if maxExcl != None and maxIncl != None: - self._addError ("Restriction attributes 'maxExclusive' and 'maxInclusive' cannot be defined together!", restrictionNode) - - listNodes = self.inputRoot.getElementsByTagNameNS (self.inputNSAlias, "list") - for listNode in listNodes: - if not listNode.hasAttribute("itemType") and restrictionNode.getFirstChildNS (self.inputNSAlias, "simpleType") == None: - self._addError ("List type must have 'itemType' attribute or 'simpleType' child tag!", listNode) - -