lbessard@151: #!/usr/bin/env python lbessard@151: # -*- coding: utf-8 -*- lbessard@151: lbessard@151: #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor lbessard@151: #based on the plcopen standard. lbessard@151: # lbessard@151: #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD lbessard@151: # lbessard@151: #See COPYING file for copyrights details. lbessard@151: # lbessard@151: #This library is free software; you can redistribute it and/or lbessard@151: #modify it under the terms of the GNU General Public lbessard@151: #License as published by the Free Software Foundation; either lbessard@151: #version 2.1 of the License, or (at your option) any later version. lbessard@151: # lbessard@151: #This library is distributed in the hope that it will be useful, lbessard@151: #but WITHOUT ANY WARRANTY; without even the implied warranty of lbessard@151: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU lbessard@151: #General Public License for more details. lbessard@151: # lbessard@151: #You should have received a copy of the GNU General Public lbessard@151: #License along with this library; if not, write to the Free Software lbessard@151: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA lbessard@151: lbessard@151: from xml.dom import minidom lbessard@151: from types import * lbessard@151: import re, datetime lbessard@151: from xmlclass import * lbessard@151: lbessard@151: def GenerateDictFacets(facets): lbessard@151: return dict([(name, (None, False)) for name in facets]) lbessard@151: lbessard@151: def GenerateSimpleTypeXMLText(function): lbessard@151: def generateXMLTextMethod(value, name = None, indent = 0): lbessard@151: text = "" lbessard@151: if name is not None: lbessard@151: ind1, ind2 = getIndent(indent, name) lbessard@151: text += ind1 + "<%s>"%name lbessard@151: text += function(value) lbessard@151: if name is not None: lbessard@151: text += "\n"%name lbessard@151: return text lbessard@151: return generateXMLTextMethod lbessard@151: lbessard@151: def GenerateFloatXMLText(extra_values = []): lbessard@151: def generateXMLTextMethod(value, name = None, indent = 0): lbessard@151: text = "" lbessard@151: if name is not None: lbessard@151: ind1, ind2 = getIndent(indent, name) lbessard@151: text += ind1 + "<%s>"%name lbessard@151: if value in extra_values or value % 1 != 0 or isinstance(value, IntType): lbessard@151: text += str(value) lbessard@151: else: lbessard@151: text += "%.0f"%value lbessard@151: if name is not None: lbessard@151: text += "\n"%name lbessard@151: return text lbessard@151: return generateXMLTextMethod lbessard@151: lbessard@151: DEFAULT_FACETS = GenerateDictFacets(["pattern", "whiteSpace", "enumeration"]) lbessard@151: NUMBER_FACETS = GenerateDictFacets(DEFAULT_FACETS.keys() + ["maxInclusive", "maxExclusive", "minInclusive", "minExclusive"]) lbessard@151: DECIMAL_FACETS = GenerateDictFacets(NUMBER_FACETS.keys() + ["totalDigits", "fractionDigits"]) lbessard@151: STRING_FACETS = GenerateDictFacets(DEFAULT_FACETS.keys() + ["length", "minLength", "maxLength"]) lbessard@151: lbessard@151: ALL_FACETS = ["pattern", "whiteSpace", "enumeration", "maxInclusive", lbessard@151: "maxExclusive", "minInclusive", "minExclusive", "totalDigits", lbessard@151: "fractionDigits", "length", "minLength", "maxLength"] lbessard@151: lbessard@151: lbessard@151: #------------------------------------------------------------------------------- lbessard@151: # Structure reducing functions lbessard@151: #------------------------------------------------------------------------------- lbessard@151: lbessard@151: lbessard@151: # Documentation elements lbessard@151: lbessard@151: def ReduceAppInfo(factory, attributes, elements): lbessard@151: return {"type" : "appinfo", "source" : attributes.get("source", None), lbessard@151: "content" : "\n".join(elements)} lbessard@151: lbessard@151: lbessard@151: def ReduceDocumentation(factory, attributes, elements): lbessard@151: return {"type" : "documentation", "source" : attributes.get("source", None), lbessard@151: "language" : attributes.get("lang", "any"), "content" : "\n".join(elements)} lbessard@151: lbessard@151: lbessard@151: def ReduceAnnotation(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: annotation = {"type" : "annotation", "appinfo" : [], "documentation" : {}} lbessard@151: for child in children: lbessard@151: if child["type"] == "appinfo": lbessard@151: annotation["appinfo"].append((child["source"], child["content"])) lbessard@151: elif child["type"] == "documentation": lbessard@151: if child["source"] is not None: lbessard@151: text = "(source : %(source)s):\n%(content)s\n\n"%child lbessard@151: else: lbessard@151: text = child["content"] + "\n\n" lbessard@151: if child["language"] not in annotation["documentation"]: lbessard@151: annotation["documentation"] = text lbessard@151: else: lbessard@151: annotation["documentation"] += text lbessard@151: return annotation lbessard@151: lbessard@151: # Simple type elements lbessard@151: lbessard@151: def GenerateFacetReducing(facetname, canbefixed): lbessard@151: def ReduceFacet(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: if "value" in attributes: lbessard@151: facet = {"type" : facetname, "value" : attributes["value"], "doc" : annotations} lbessard@151: if canbefixed: lbessard@151: facet["fixed"] = attributes.get("fixed", False) lbessard@151: return facet lbessard@151: raise ValueError, "A value must be defined for the \"%s\" facet!"%facetname lbessard@151: return ReduceFacet lbessard@151: lbessard@151: lbessard@151: def ReduceList(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: list = {"type" : "list", "itemType" : attributes.get("itemType", None), "doc" : annotations} lbessard@151: lbessard@151: if len(children) > 0 and children[0]["type"] == SIMPLETYPE: lbessard@151: if list["itemType"] is None: lbessard@151: list["itemType"] = children[0] lbessard@151: else: lbessard@151: raise ValueError, "Only one base type can be defined for restriction!" lbessard@151: if list["itemType"] is None: lbessard@151: raise ValueError, "No base type has been defined for list!" lbessard@151: return list lbessard@151: lbessard@151: lbessard@151: def ReduceUnion(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: union = {"type" : "union", "memberTypes" : attributes.get("memberTypes", []), "doc" : annotations} lbessard@151: lbessard@151: if child in children: lbessard@151: if child["type"] == SIMPLETYPE: lbessard@151: union["memberTypes"] = child lbessard@151: if len(union["memberTypes"]) == 0: lbessard@151: raise ValueError, "No base type has been defined for union!" lbessard@151: return list lbessard@151: lbessard@151: lbessard@151: def ReduceSimpleType(factory, attributes, elements): lbessard@151: # Reduce all the simple type children lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: lbessard@151: typeinfos = children[0] lbessard@151: lbessard@151: # Initialize type informations lbessard@151: facets = {} lbessard@151: simpleType = {"type" : SIMPLETYPE, "final" : attributes.get("final", []), "doc" : annotations} lbessard@151: if "name" in attributes: lbessard@151: simpleType["name"] = attributes["name"] lbessard@151: lbessard@151: if typeinfos["type"] == "restriction": lbessard@151: # Search for base type definition lbessard@151: if isinstance(typeinfos["base"], (StringType, UnicodeType)): lbessard@151: basetypeinfos = factory.FindSchemaElement(typeinfos["base"], SIMPLETYPE) lbessard@151: if basetypeinfos is None: lbessard@151: raise "\"%s\" isn't defined!"%typeinfos["base"] lbessard@151: else: lbessard@151: basetypeinfos = typeinfos["base"] lbessard@151: lbessard@151: # Check that base type is a simple type lbessard@151: if basetypeinfos["type"] != SIMPLETYPE: lbessard@151: raise ValueError, "Base type given isn't a simpleType!" lbessard@151: lbessard@151: typeinfos["basename"] = basetypeinfos["basename"] lbessard@151: lbessard@151: # Check that derivation is allowed lbessard@151: if "final" in basetypeinfos: lbessard@151: if "#all" in basetypeinfos["final"]: lbessard@151: raise ValueError, "Base type can't be derivated!" lbessard@151: if "restriction" in basetypeinfos["final"]: lbessard@151: raise ValueError, "Base type can't be derivated by restriction!" lbessard@151: lbessard@151: # Extract simple type facets lbessard@151: for facet in typeinfos["facets"]: lbessard@151: facettype = facet["type"] lbessard@151: if facettype not in basetypeinfos["facets"]: lbessard@151: raise ValueError, "\"%s\" facet can't be defined for \"%s\" type!"%(facettype, type) lbessard@151: elif basetypeinfos["facets"][facettype][1]: lbessard@151: raise ValueError, "\"%s\" facet is fixed on base type!"%facettype lbessard@151: value = facet["value"] lbessard@151: basevalue = basetypeinfos["facets"][facettype][0] lbessard@151: if facettype == "enumeration": lbessard@151: value = basetypeinfos["extract"](value, False) lbessard@151: if len(facets) == 0: lbessard@151: facets["enumeration"] = ([value], False) lbessard@151: continue lbessard@151: elif facets.keys() == ["enumeration"]: lbessard@151: facets["enumeration"][0].append(value) lbessard@151: continue lbessard@151: else: lbessard@151: raise ValueError, "\"enumeration\" facet can't be defined with another facet type!" lbessard@151: elif "enumeration" in facets: lbessard@151: raise ValueError, "\"enumeration\" facet can't be defined with another facet type!" lbessard@151: elif facettype in facets: lbessard@151: raise ValueError, "\"%s\" facet can't be defined two times!"%facettype lbessard@151: elif facettype == "length": lbessard@151: if "minLength" in facets: lbessard@151: raise ValueError, "\"length\" and \"minLength\" facets can't be defined at the same time!" lbessard@151: if "maxLength" in facets: lbessard@151: raise ValueError, "\"length\" and \"maxLength\" facets can't be defined at the same time!" lbessard@151: try: lbessard@151: value = int(value) lbessard@151: except: lbessard@151: raise ValueError, "\"length\" must be an integer!" lbessard@151: if value < 0: lbessard@151: raise ValueError, "\"length\" can't be negative!" lbessard@151: elif basevalue is not None and basevalue != value: lbessard@151: raise ValueError, "\"length\" can't be different from \"length\" defined in base type!" lbessard@151: elif facettype == "minLength": lbessard@151: if "length" in facets: lbessard@151: raise ValueError, "\"length\" and \"minLength\" facets can't be defined at the same time!" lbessard@151: try: lbessard@151: value = int(value) lbessard@151: except: lbessard@151: raise ValueError, "\"minLength\" must be an integer!" lbessard@151: if value < 0: lbessard@151: raise ValueError, "\"minLength\" can't be negative!" lbessard@151: elif "maxLength" in facets and value > facets["maxLength"]: lbessard@151: raise ValueError, "\"minLength\" must be lesser than or equal to \"maxLength\"!" lbessard@151: elif basevalue is not None and basevalue < value: lbessard@151: raise ValueError, "\"minLength\" can't be lesser than \"minLength\" defined in base type!" lbessard@151: elif facettype == "maxLength": lbessard@151: if "length" in facets: lbessard@151: raise ValueError, "\"length\" and \"maxLength\" facets can't be defined at the same time!" lbessard@151: try: lbessard@151: value = int(value) lbessard@151: except: lbessard@151: raise ValueError, "\"maxLength\" must be an integer!" lbessard@151: if value < 0: lbessard@151: raise ValueError, "\"maxLength\" can't be negative!" lbessard@151: elif "minLength" in facets and value < facets["minLength"]: lbessard@151: raise ValueError, "\"minLength\" must be lesser than or equal to \"maxLength\"!" lbessard@151: elif basevalue is not None and basevalue > value: lbessard@151: raise ValueError, "\"maxLength\" can't be greater than \"maxLength\" defined in base type!" lbessard@151: elif facettype == "minInclusive": lbessard@151: if "minExclusive" in facets: lbessard@151: raise ValueError, "\"minExclusive\" and \"minInclusive\" facets can't be defined at the same time!" lbessard@151: value = basetypeinfos["extract"](facet["value"], False) lbessard@151: if "maxInclusive" in facets and value > facets["maxInclusive"][0]: lbessard@151: raise ValueError, "\"minInclusive\" must be lesser than or equal to \"maxInclusive\"!" lbessard@151: elif "maxExclusive" in facets and value >= facets["maxExclusive"][0]: lbessard@151: raise ValueError, "\"minInclusive\" must be lesser than \"maxExclusive\"!" lbessard@151: elif facettype == "minExclusive": lbessard@151: if "minInclusive" in facets: lbessard@151: raise ValueError, "\"minExclusive\" and \"minInclusive\" facets can't be defined at the same time!" lbessard@151: value = basetypeinfos["extract"](facet["value"], False) lbessard@151: if "maxInclusive" in facets and value >= facets["maxInclusive"][0]: lbessard@151: raise ValueError, "\"minExclusive\" must be lesser than \"maxInclusive\"!" lbessard@151: elif "maxExclusive" in facets and value >= facets["maxExclusive"][0]: lbessard@151: raise ValueError, "\"minExclusive\" must be lesser than \"maxExclusive\"!" lbessard@151: elif facettype == "maxInclusive": lbessard@151: if "maxExclusive" in facets: lbessard@151: raise ValueError, "\"maxExclusive\" and \"maxInclusive\" facets can't be defined at the same time!" lbessard@151: value = basetypeinfos["extract"](facet["value"], False) lbessard@151: if "minInclusive" in facets and value < facets["minInclusive"][0]: lbessard@151: raise ValueError, "\"minInclusive\" must be lesser than or equal to \"maxInclusive\"!" lbessard@151: elif "minExclusive" in facets and value <= facets["minExclusive"][0]: lbessard@151: raise ValueError, "\"minExclusive\" must be lesser than \"maxInclusive\"!" lbessard@151: elif facettype == "maxExclusive": lbessard@151: if "maxInclusive" in facets: lbessard@151: raise ValueError, "\"maxExclusive\" and \"maxInclusive\" facets can't be defined at the same time!" lbessard@151: value = basetypeinfos["extract"](facet["value"], False) lbessard@151: if "minInclusive" in facets and value <= facets["minInclusive"][0]: lbessard@151: raise ValueError, "\"minInclusive\" must be lesser than \"maxExclusive\"!" lbessard@151: elif "minExclusive" in facets and value <= facets["minExclusive"][0]: lbessard@151: raise ValueError, "\"minExclusive\" must be lesser than \"maxExclusive\"!" lbessard@151: elif facettype == "whiteSpace": lbessard@151: if basevalue == "collapse" and value in ["preserve", "replace"] or basevalue == "replace" and value == "preserve": lbessard@151: raise ValueError, "\"whiteSpace\" is incompatible with \"whiteSpace\" defined in base type!" lbessard@151: elif facettype == "totalDigits": lbessard@151: if "fractionDigits" in facets and value <= facets["fractionDigits"][0]: lbessard@151: raise ValueError, "\"fractionDigits\" must be lesser than or equal to \"totalDigits\"!" lbessard@151: elif basevalue is not None and value > basevalue: lbessard@151: raise ValueError, "\"totalDigits\" can't be greater than \"totalDigits\" defined in base type!" lbessard@151: elif facettype == "fractionDigits": lbessard@151: if "totalDigits" in facets and value <= facets["totalDigits"][0]: lbessard@151: raise ValueError, "\"fractionDigits\" must be lesser than or equal to \"totalDigits\"!" lbessard@151: elif basevalue is not None and value > basevalue: lbessard@151: raise ValueError, "\"totalDigits\" can't be greater than \"totalDigits\" defined in base type!" lbessard@151: facets[facettype] = (value, facet.get("fixed", False)) lbessard@151: lbessard@151: # Report not redefined facet from base type to new created type lbessard@151: for facettype, facetvalue in basetypeinfos["facets"].items(): lbessard@151: if facettype not in facets: lbessard@151: facets[facettype] = facetvalue lbessard@151: lbessard@151: # Generate extract value for new created type lbessard@151: def ExtractSimpleTypeValue(attr, extract = True): lbessard@151: value = basetypeinfos["extract"](attr, extract) lbessard@151: for facetname, (facetvalue, facetfixed) in facets.items(): lbessard@151: if facetvalue is not None: lbessard@151: if facetname == "enumeration" and value not in facetvalue: lbessard@151: raise ValueError, "\"%s\" not in enumerated values"%value lbessard@151: elif facetname == "length" and len(value) != facetvalue: lbessard@151: raise ValueError, "value must have a length of %d"%facetvalue lbessard@151: elif facetname == "minLength" and len(value) < facetvalue: lbessard@151: raise ValueError, "value must have a length of %d at least"%facetvalue lbessard@151: elif facetname == "maxLength" and len(value) > facetvalue: lbessard@151: raise ValueError, "value must have a length of %d at most"%facetvalue lbessard@151: elif facetname == "minInclusive" and value < facetvalue: lbessard@151: raise ValueError, "value must be greater than or equal to %s"%str(facetvalue) lbessard@151: elif facetname == "minExclusive" and value <= facetvalue: lbessard@151: raise ValueError, "value must be greater than %s"%str(facetvalue) lbessard@151: elif facetname == "maxInclusive" and value > facetvalue: lbessard@151: raise ValueError, "value must be lesser than or equal to %s"%str(facetvalue) lbessard@151: elif facetname == "maxExclusive" and value >= facetvalue: lbessard@151: raise ValueError, "value must be lesser than %s"%str(facetvalue) lbessard@151: elif facetname == "pattern": lbessard@151: model = re.compile("(?:%s)?$"%facetvalue) lbessard@151: result = model.match(value) lbessard@151: if result is None: lbessard@151: raise ValueError, "value doesn't follow the pattern %s"%facetvalue lbessard@151: elif facetname == "whiteSpace": lbessard@151: if facetvalue == "replace": lbessard@151: value = GetNormalizedString(value, False) lbessard@151: elif facetvalue == "collapse": lbessard@151: value = GetToken(value, False) lbessard@151: return value lbessard@151: lbessard@151: def CheckSimpleTypeValue(value): lbessard@151: for facetname, (facetvalue, facetfixed) in facets.items(): lbessard@151: if facetvalue is not None: lbessard@151: if facetname == "enumeration" and value not in facetvalue: lbessard@151: return False lbessard@151: elif facetname == "length" and len(value) != facetvalue: lbessard@151: return False lbessard@151: elif facetname == "minLength" and len(value) < facetvalue: lbessard@151: return False lbessard@151: elif facetname == "maxLength" and len(value) > facetvalue: lbessard@151: return False lbessard@151: elif facetname == "minInclusive" and value < facetvalue: lbessard@151: return False lbessard@151: elif facetname == "minExclusive" and value <= facetvalue: lbessard@151: return False lbessard@151: elif facetname == "maxInclusive" and value > facetvalue: lbessard@151: return False lbessard@151: elif facetname == "maxExclusive" and value >= facetvalue: lbessard@151: return False lbessard@151: elif facetname == "pattern": lbessard@151: model = re.compile("(?:%s)?$"%facetvalue) lbessard@151: result = model.match(value) lbessard@151: if result is None: lbessard@151: raise ValueError, "value doesn't follow the pattern %s"%facetvalue lbessard@151: return True lbessard@151: lbessard@151: def SimpleTypeInitialValue(): lbessard@151: for facetname, (facetvalue, facetfixed) in facets.items(): lbessard@151: if facetvalue is not None: lbessard@151: if facetname == "enumeration": lbessard@151: return facetvalue[0] lbessard@151: elif facetname == "length": lbessard@151: return " "*facetvalue lbessard@151: elif facetname == "minLength": lbessard@151: return " "*minLength lbessard@151: elif facetname == "minInclusive" and facetvalue > 0: lbessard@151: return facetvalue lbessard@151: elif facetname == "minExclusive" and facetvalue >= 0: lbessard@151: return facetvalue + 1 lbessard@151: elif facetname == "maxInclusive" and facetvalue < 0: lbessard@151: return facetvalue lbessard@151: elif facetname == "maxExclusive" and facetvalue <= 0: lbessard@151: return facetvalue - 1 lbessard@151: return basetypeinfos["initial"]() lbessard@151: lbessard@151: GenerateSimpleType = basetypeinfos["generate"] lbessard@151: lbessard@151: elif typeinfos["type"] == "list": lbessard@151: # Search for item type definition lbessard@151: if isinstance(typeinfos["itemType"], (StringType, UnicodeType)): lbessard@151: itemtypeinfos = factory.FindSchemaElement(typeinfos["itemType"], SIMPLETYPE) lbessard@151: if itemtypeinfos is None: lbessard@151: raise "\"%s\" isn't defined!"%typeinfos["itemType"] lbessard@151: else: lbessard@151: itemtypeinfos = typeinfos["itemType"] lbessard@151: lbessard@151: # Check that item type is a simple type lbessard@151: if itemtypeinfos["type"] != SIMPLETYPE: lbessard@151: raise ValueError, "Item type given isn't a simpleType!" lbessard@151: lbessard@151: # Check that derivation is allowed lbessard@151: if "#all" in itemtypeinfos["final"]: lbessard@151: raise ValueError, "Item type can't be derivated!" lbessard@151: if "list" in itemtypeinfos["final"]: lbessard@151: raise ValueError, "Item type can't be derivated by list!" lbessard@151: lbessard@151: # Generate extract value for new created type lbessard@151: def ExtractSimpleTypeValue(attr, extract = True): lbessard@151: values = [] lbessard@151: for value in GetToken(attr, extract).split(" "): lbessard@151: values.append(itemtypeinfos["extract"](value, False)) lbessard@151: return values lbessard@151: lbessard@151: def CheckSimpleTypeValue(value): lbessard@151: for value in GetToken(attr, extract).split(" "): lbessard@151: result = itemtypeinfos["check"](value) lbessard@151: if not result: lbessard@151: return result lbessard@151: return True lbessard@151: lbessard@151: SimpleTypeInitialValue = lambda: "" lbessard@151: lbessard@151: GenerateSimpleType = GenerateSimpleTypeXMLText(lambda x : " ".join(map(itemtypeinfos, values))) lbessard@151: lbessard@151: facets = GenerateDictFacets(["length", "maxLength", "minLength", "enumeration", "pattern"]) lbessard@151: facet["whiteSpace"] = ("collapse", False) lbessard@151: lbessard@151: elif typeinfos["type"] == "union": lbessard@151: # Search for member types definition lbessard@151: membertypesinfos = [] lbessard@151: for membertype in typeinfos["memberTypes"]: lbessard@151: if isinstance(membertype, (StringType, UnicodeType)): lbessard@151: infos = factory.FindSchemaElement(typeinfos["memberTypes"], SIMPLETYPE) lbessard@151: if infos is None: lbessard@151: raise "\"%s\" isn't defined!"%typeinfos["itemType"] lbessard@151: else: lbessard@151: infos = membertype lbessard@151: lbessard@151: # Check that member type is a simple type lbessard@151: if infos["type"] != SIMPLETYPE: lbessard@151: raise ValueError, "Member type given isn't a simpleType!" lbessard@151: lbessard@151: # Check that derivation is allowed lbessard@151: if "#all" in infos["final"]: lbessard@151: raise ValueError, "Item type can't be derivated!" lbessard@151: if "union" in infos["final"]: lbessard@151: raise ValueError, "Member type can't be derivated by union!" lbessard@151: lbessard@151: membertypesinfos.append(infos) lbessard@151: lbessard@151: # Generate extract value for new created type lbessard@151: def ExtractSimpleTypeValue(attr, extract = True): lbessard@151: if extract: lbessard@151: value = GetAttributeValue(attr) lbessard@151: else: lbessard@151: value = attr lbessard@151: for infos in membertypesinfos: lbessard@151: try: lbessard@151: return infos["extract"](attr, False) lbessard@151: except: lbessard@151: pass lbessard@151: raise ValueError, "\"%s\" isn't valid for type defined for union!" lbessard@151: lbessard@151: def CheckSimpleTypeValue(value): lbessard@151: for infos in membertypesinfos: lbessard@151: result = infos["check"](value) lbessard@151: if result: lbessard@151: return result lbessard@151: return False lbessard@151: lbessard@151: SimpleTypeInitialValue = membertypesinfos[0]["initial"] lbessard@151: lbessard@151: def GenerateSimpleTypeFunction(value): lbessard@151: if isinstance(value, BooleanType): lbessard@151: return {True : "true", False : "false"}[value] lbessard@151: else: lbessard@151: return str(value) lbessard@151: GenerateSimpleType = GenerateSimpleTypeXMLText(GenerateSimpleTypeFunction) lbessard@151: lbessard@151: facets = GenerateDictFacets(["pattern", "enumeration"]) lbessard@151: lbessard@151: simpleType["facets"] = facets lbessard@151: simpleType["extract"] = ExtractSimpleTypeValue lbessard@151: simpleType["initial"] = SimpleTypeInitialValue lbessard@151: simpleType["check"] = CheckSimpleTypeValue lbessard@151: simpleType["generate"] = GenerateSimpleType lbessard@151: return simpleType lbessard@151: lbessard@151: lbessard@151: # Complex type lbessard@151: lbessard@151: def ExtractAttributes(factory, elements, base = None): lbessard@151: if base is not None: lbessard@151: basetypeinfos = factory.FindSchemaElement(base, COMPLEXTYPE) lbessard@151: if isinstance(basetypeinfos, (UnicodeType, StringType)): lbessard@151: attrnames = {} lbessard@151: else: lbessard@151: attrnames = dict(map(lambda x:(x["name"], True), basetypeinfos["attributes"])) lbessard@151: else: lbessard@151: attrnames = {} lbessard@151: attrs = [] lbessard@151: for element in elements: lbessard@151: if element["type"] == ATTRIBUTE: lbessard@151: if attrnames.get(element["name"], False): lbessard@151: raise ValueError, "\"%s\" attribute has been defined two times!"%element["name"] lbessard@151: else: lbessard@151: attrnames[element["name"]] = True lbessard@151: attrs.append(element) lbessard@151: elif element["type"] == "attributeGroup": lbessard@151: attrgroup = factory.FindSchemaElement(element["ref"], ATTRIBUTESGROUP) lbessard@151: for attr in attrgroup["attributes"]: lbessard@151: if attrnames.get(attr["name"], False): lbessard@151: raise ValueError, "\"%s\" attribute has been defined two times!"%attr["name"] lbessard@151: else: lbessard@151: attrnames[attr["name"]] = True lbessard@151: attrs.append(attr) lbessard@151: elif element["type"] == "anyAttribute": lbessard@151: raise ValueError, "\"anyAttribute\" element isn't supported yet!" lbessard@151: return attrs lbessard@151: lbessard@151: lbessard@151: def ReduceRestriction(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: restriction = {"type" : "restriction", "base" : attributes.get("base", None), "facets" : [], "doc" : annotations} lbessard@151: if len(children) > 0 and children[0]["type"] == SIMPLETYPE: lbessard@151: if restriction["base"] is None: lbessard@151: restriction["base"] = children.pop(0) lbessard@151: else: lbessard@151: raise ValueError, "Only one base type can be defined for restriction!" lbessard@151: if restriction["base"] is None: lbessard@151: raise ValueError, "No base type has been defined for restriction!" lbessard@151: lbessard@151: while len(children) > 0 and children[0]["type"] in ALL_FACETS: lbessard@151: restriction["facets"].append(children.pop(0)) lbessard@151: restriction["attributes"] = ExtractAttributes(factory, children) lbessard@151: return restriction lbessard@151: lbessard@151: lbessard@151: def ReduceExtension(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: extension = {"type" : "extension", "attributes" : [], "elements" : [], "base" : attributes.get("base", None), "doc" : annotations} lbessard@151: if len(children) > 0: lbessard@151: if children[0]["type"] in ["group", "all", CHOICE, "sequence"]: lbessard@151: group = children.pop(0) lbessard@151: if group["type"] in ["all", "sequence"]: lbessard@151: extension["elements"] = group["elements"] lbessard@151: extension["order"] = group["order"] lbessard@151: elif group["type"] == CHOICE: lbessard@151: content = group.copy() lbessard@151: content["name"] = "content" lbessard@151: extension["elements"].append(content) lbessard@151: elif group["type"] == "group": lbessard@151: elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP) lbessard@151: if "elements" in elmtgroup: lbessard@151: extension["elements"] = elmtgroup["elements"] lbessard@151: extension["order"] = elmtgroup["order"] lbessard@151: else: lbessard@151: content = elmtgroup.copy() lbessard@151: content["name"] = "content" lbessard@151: extension["elements"].append(content) lbessard@151: extension["attributes"] = ExtractAttributes(factory, children, extension["base"]) lbessard@151: return extension lbessard@151: lbessard@151: lbessard@151: def ReduceSimpleContent(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: simpleContent = children[0].copy() lbessard@151: simpleContent["type"] = "simpleContent" lbessard@151: return simpleContent lbessard@151: lbessard@151: lbessard@151: def ReduceComplexContent(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: complexContent = children[0].copy() lbessard@151: complexContent["type"] = "complexContent" lbessard@151: return complexContent lbessard@151: lbessard@151: lbessard@151: def ReduceComplexType(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: lbessard@151: if len(children) > 0: lbessard@151: if children[0]["type"] in ["simpleContent", "complexContent"]: lbessard@151: complexType = children[0].copy() lbessard@151: complexType.update(attributes) lbessard@151: complexType["type"] = COMPLEXTYPE lbessard@151: return complexType lbessard@151: elif children[0]["type"] in ["group", "all", CHOICE, "sequence"]: lbessard@151: complexType = {"type" : COMPLEXTYPE, "elements" : [], "order" : True, "doc" : annotations} lbessard@151: complexType.update(attributes) lbessard@151: group = children.pop(0) lbessard@151: if group["type"] in ["all", "sequence"]: lbessard@151: if group["minOccurs"] == 0 or group["maxOccurs"] != 1: lbessard@151: if len(group["elements"]) > 1: lbessard@151: raise ValueError, "Not supported yet!" lbessard@151: if group["minOccurs"] == 0: lbessard@151: group["elements"][0]["minOccurs"] = group["minOccurs"] lbessard@151: if group["maxOccurs"] != 1: lbessard@151: group["elements"][0]["maxOccurs"] = group["maxOccurs"] lbessard@151: complexType["elements"] = group["elements"] lbessard@151: complexType["order"] = group["order"] lbessard@151: elif group["type"] == CHOICE: lbessard@151: content = group.copy() lbessard@151: content["name"] = "content" lbessard@151: complexType["elements"].append(content) lbessard@151: elif group["type"] == "group": lbessard@151: elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP) lbessard@151: if "elements" in elmtgroup: lbessard@151: complexType["elements"] = elmtgroup["elements"] lbessard@151: complexType["order"] = elmtgroup["order"] lbessard@151: else: lbessard@151: content = elmtgroup.copy() lbessard@151: content["name"] = "content" lbessard@151: complexType["elements"].append(content) lbessard@151: else: lbessard@151: complexType = {"elements" : [], "order" : True, "doc" : annotations} lbessard@151: complexType.update(attributes) lbessard@151: complexType["type"] = COMPLEXTYPE lbessard@151: complexType["attributes"] = ExtractAttributes(factory, children) lbessard@151: return complexType lbessard@151: else: lbessard@151: raise ValueError, "\"ComplexType\" can't be empty!" lbessard@151: lbessard@151: lbessard@151: # Attribute elements lbessard@151: lbessard@151: def ReduceAnyAttribute(factory, attributes, elements): lbessard@151: return {"type" : "anyAttribute"} lbessard@151: lbessard@151: lbessard@151: def ReduceAttribute(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: lbessard@151: if "default" in attributes: lbessard@151: if "fixed" in attributes: lbessard@151: raise ValueError, "\"default\" and \"fixed\" can't be defined at the same time!" lbessard@151: elif attributes.get("use", "optional") != "optional": lbessard@151: raise ValueError, "if \"default\" present, \"use\" can only have the value \"optional\"!" lbessard@151: lbessard@151: attribute = {"type" : ATTRIBUTE, "attr_type" : attributes.get("type", None), "doc" : annotations} lbessard@151: if len(children) > 0: lbessard@151: if attribute["attr_type"] is None: lbessard@151: attribute["attr_type"] = children[0] lbessard@151: else: lbessard@151: raise ValueError, "Only one type can be defined for attribute!" lbessard@151: lbessard@151: if "ref" in attributes: lbessard@151: if "name" in attributes: lbessard@151: raise ValueError, "\"ref\" and \"name\" can't be defined at the same time!" lbessard@151: elif "form" in attributes: lbessard@151: raise ValueError, "\"ref\" and \"form\" can't be defined at the same time!" lbessard@151: elif attribute["attr_type"] is not None: lbessard@151: raise ValueError, "if \"ref\" is present, no type can be defined!" lbessard@151: elif attribute["attr_type"] is None: lbessard@151: raise ValueError, "No type has been defined for attribute!" lbessard@151: lbessard@151: if "type" in attributes: lbessard@151: tmp_attrs = attributes.copy() lbessard@151: tmp_attrs.pop("type") lbessard@151: attribute.update(tmp_attrs) lbessard@151: else: lbessard@151: attribute.update(attributes) lbessard@151: return attribute lbessard@151: lbessard@151: lbessard@151: def ReduceAttributeGroup(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: if "ref" in attributes: lbessard@151: return {"type" : "attributeGroup", "ref" : attributes["ref"], "doc" : annotations} lbessard@151: else: lbessard@151: return {"type" : ATTRIBUTESGROUP, "attributes" : ExtractAttributes(factory, children), "doc" : annotations} lbessard@151: lbessard@151: lbessard@151: # Elements groups lbessard@151: lbessard@151: def ReduceAny(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: lbessard@151: any = {"type" : ANY, "doc" : annotations} lbessard@151: any.update(attributes) lbessard@151: return any lbessard@151: lbessard@151: def ReduceElement(factory, attributes, elements): lbessard@151: if "default" in attributes and "fixed" in attributes: lbessard@151: raise ValueError, "\"default\" and \"fixed\" can't be defined at the same time!" lbessard@151: lbessard@151: if "ref" in attributes: lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: lbessard@151: for attr in ["name", "default", "fixed", "form", "block", "type"]: lbessard@151: if attr in attributes: lbessard@151: raise ValueError, "\"ref\" and \"%s\" can't be defined at the same time!"%attr lbessard@151: if attributes.get("nillable", False): lbessard@151: raise ValueError, "\"ref\" and \"nillable\" can't be defined at the same time!" lbessard@151: if len(children) > 0: lbessard@151: raise ValueError, "No type and no constraints can be defined where \"ref\" is defined!" lbessard@151: lbessard@151: infos = factory.FindSchemaElement(attributes["ref"], ELEMENT) lbessard@151: if infos is not None: lbessard@151: element = infos.copy() lbessard@151: element["minOccurs"] = attributes["minOccurs"] lbessard@151: element["maxOccurs"] = attributes["maxOccurs"] lbessard@151: return element lbessard@151: else: lbessard@151: raise ValueError, "\"%s\" base type isn't defined or circular referenced!"%name lbessard@151: lbessard@151: elif "name" in attributes: lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: lbessard@151: element = {"type" : ELEMENT, "elmt_type" : attributes.get("type", None), "doc" : annotations} lbessard@151: if len(children) > 0: lbessard@151: if element["elmt_type"] is None: lbessard@151: element["elmt_type"] = children[0] lbessard@151: else: lbessard@151: raise ValueError, "Only one type can be defined for attribute!" lbessard@151: elif element["elmt_type"] is None: lbessard@151: element["elmt_type"] = "tag" lbessard@151: element["type"] = TAG lbessard@151: lbessard@151: if "type" in attributes: lbessard@151: tmp_attrs = attributes.copy() lbessard@151: tmp_attrs.pop("type") lbessard@151: element.update(tmp_attrs) lbessard@151: else: lbessard@151: element.update(attributes) lbessard@151: return element lbessard@151: else: lbessard@151: raise ValueError, "\"Element\" must have at least a \"ref\" or a \"name\" defined!" lbessard@151: lbessard@151: def ReduceAll(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: lbessard@151: for child in children: lbessard@151: if children["maxOccurs"] == "unbounded" or children["maxOccurs"] > 1: lbessard@151: raise ValueError, "\"all\" item can't have \"maxOccurs\" attribute greater than 1!" lbessard@151: lbessard@151: return {"type" : "all", "elements" : children, "minOccurs" : attributes["minOccurs"], lbessard@151: "maxOccurs" : attributes["maxOccurs"], "order" : False, "doc" : annotations} lbessard@151: lbessard@151: lbessard@151: def ReduceChoice(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: lbessard@151: choices = [] lbessard@151: for child in children: lbessard@151: if child["type"] in [ELEMENT, ANY, TAG]: lbessard@151: choices.append(child) lbessard@151: elif child["type"] == "sequence": lbessard@151: raise ValueError, "\"sequence\" in \"choice\" is not supported. Create instead a new complex type!" lbessard@151: elif child["type"] == CHOICE: lbessard@151: choices.extend(child["choices"]) lbessard@151: elif child["type"] == "group": lbessard@151: elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP) lbessard@151: if "choices" not in elmtgroup: lbessard@151: raise ValueError, "Only group composed of \"choice\" can be referenced in \"choice\" element!" lbessard@151: choices_tmp = [] lbessard@151: for choice in elmtgroup["choices"]: lbessard@151: if not isinstance(choice["elmt_type"], (UnicodeType, StringType)) and choice["elmt_type"]["type"] == COMPLEXTYPE: lbessard@151: elmt_type = "%s_%s"%(elmtgroup["name"], choice["name"]) lbessard@151: if factory.TargetNamespace is not None: lbessard@151: elmt_type = "%s:%s"%(factory.TargetNamespace, elmt_type) lbessard@151: new_choice = choice.copy() lbessard@151: new_choice["elmt_type"] = elmt_type lbessard@151: choices_tmp.append(new_choice) lbessard@151: else: lbessard@151: choices_tmp.append(choice) lbessard@151: choices.extend(choices_tmp) lbessard@151: lbessard@151: return {"type" : CHOICE, "choices" : choices, "minOccurs" : attributes["minOccurs"], lbessard@151: "maxOccurs" : attributes["maxOccurs"], "doc" : annotations} lbessard@151: lbessard@151: lbessard@151: def ReduceSequence(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: lbessard@151: sequence = [] lbessard@151: for child in children: lbessard@151: if child["type"] in [ELEMENT, ANY, TAG]: lbessard@151: sequence.append(child) lbessard@151: elif child["type"] == CHOICE: lbessard@151: content = child.copy() lbessard@151: content["name"] = "content" lbessard@151: sequence.append(content) lbessard@151: elif child["type"] == "sequence": lbessard@151: sequence.extend(child["elements"]) lbessard@151: elif child["type"] == "group": lbessard@151: elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP) lbessard@151: if "elements" not in elmtgroup or not elmtgroup["order"]: lbessard@151: raise ValueError, "Only group composed of \"sequence\" can be referenced in \"sequence\" element!" lbessard@151: elements_tmp = [] lbessard@151: for element in elmtgroup["elements"]: lbessard@151: if not isinstance(element["elmt_type"], (UnicodeType, StringType)) and element["elmt_type"]["type"] == COMPLEXTYPE: lbessard@151: elmt_type = "%s_%s"%(elmtgroup["name"], element["name"]) lbessard@151: if factory.TargetNamespace is not None: lbessard@151: elmt_type = "%s:%s"%(factory.TargetNamespace, elmt_type) lbessard@151: new_element = element.copy() lbessard@151: new_element["elmt_type"] = elmt_type lbessard@151: elements_tmp.append(new_element) lbessard@151: else: lbessard@151: elements_tmp.append(element) lbessard@151: sequence.extend(elements_tmp) lbessard@151: lbessard@151: return {"type" : "sequence", "elements" : sequence, "minOccurs" : attributes["minOccurs"], lbessard@151: "maxOccurs" : attributes["maxOccurs"], "order" : True, "doc" : annotations} lbessard@151: lbessard@151: lbessard@151: def ReduceGroup(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: lbessard@151: if "ref" in attributes: lbessard@151: return {"type" : "group", "ref" : attributes["ref"], "doc" : annotations} lbessard@151: else: lbessard@151: element = children[0] lbessard@151: group = {"type" : ELEMENTSGROUP, "doc" : annotations} lbessard@151: if element["type"] == CHOICE: lbessard@151: group["choices"] = element["choices"] lbessard@151: else: lbessard@151: group.update({"elements" : element["elements"], "order" : group["order"]}) lbessard@151: group.update(attributes) lbessard@151: return group lbessard@151: lbessard@151: # Constraint elements lbessard@151: lbessard@151: def ReduceUnique(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: raise ValueError, "\"unique\" element isn't supported yet!" lbessard@151: lbessard@151: def ReduceKey(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: raise ValueError, "\"key\" element isn't supported yet!" lbessard@151: lbessard@151: def ReduceKeyRef(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: raise ValueError, "\"keyref\" element isn't supported yet!" lbessard@151: lbessard@151: def ReduceSelector(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: raise ValueError, "\"selector\" element isn't supported yet!" lbessard@151: lbessard@151: def ReduceField(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: raise ValueError, "\"field\" element isn't supported yet!" lbessard@151: lbessard@151: lbessard@151: # Inclusion elements lbessard@151: lbessard@151: def ReduceImport(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: raise ValueError, "\"import\" element isn't supported yet!" lbessard@151: lbessard@151: def ReduceInclude(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: raise ValueError, "\"include\" element isn't supported yet!" lbessard@151: lbessard@151: def ReduceRedefine(factory, attributes, elements): lbessard@151: annotations, children = factory.ReduceElements(elements) lbessard@151: raise ValueError, "\"redefine\" element isn't supported yet!" lbessard@151: lbessard@151: lbessard@151: # Schema element lbessard@151: lbessard@151: def ReduceSchema(factory, attributes, elements): lbessard@151: factory.AttributeFormDefault = attributes["attributeFormDefault"] lbessard@151: factory.ElementFormDefault = attributes["elementFormDefault"] lbessard@151: factory.BlockDefault = attributes["blockDefault"] lbessard@151: factory.FinalDefault = attributes["finalDefault"] lbessard@151: lbessard@151: if "targetNamespace" in attributes: lbessard@151: factory.TargetNamespace = factory.DefinedNamespaces.get(attributes["targetNamespace"], None) lbessard@151: factory.Namespaces[factory.TargetNamespace] = {} lbessard@151: lbessard@151: annotations, children = factory.ReduceElements(elements, True) lbessard@151: lbessard@151: for child in children: lbessard@151: if "name" in child: lbessard@151: infos = factory.GetQualifiedNameInfos(child["name"], factory.TargetNamespace, True) lbessard@151: if infos is None: lbessard@151: factory.Namespaces[factory.TargetNamespace][child["name"]] = child lbessard@151: elif not CompareSchema(infos, child): lbessard@151: raise ValueError, "\"%s\" is defined twice in targetNamespace!"%child["name"] lbessard@151: lbessard@151: def CompareSchema(schema, reference): lbessard@151: if isinstance(schema, ListType): lbessard@151: if not isinstance(reference, ListType) or len(schema) != len(reference): lbessard@151: return False lbessard@151: for i, value in enumerate(schema): lbessard@151: result = CompareSchema(value, reference[i]) lbessard@151: if not result: lbessard@151: return result lbessard@151: return True lbessard@151: elif isinstance(schema, DictType): lbessard@151: if not isinstance(reference, DictType) or len(schema) != len(reference): lbessard@151: return False lbessard@151: for name, value in schema.items(): lbessard@151: ref_value = reference.get(name, None) lbessard@151: if ref_value is None: lbessard@151: return False lbessard@151: result = CompareSchema(value, ref_value) lbessard@151: if not result: lbessard@151: return result lbessard@151: return True lbessard@151: elif isinstance(schema, FunctionType): lbessard@151: if not isinstance(reference, FunctionType) or schema.__name__ != reference.__name__: lbessard@151: return False lbessard@151: else: lbessard@151: return True lbessard@151: return schema == reference lbessard@151: lbessard@151: #------------------------------------------------------------------------------- lbessard@151: # Base class for XSD schema extraction lbessard@151: #------------------------------------------------------------------------------- lbessard@151: lbessard@151: lbessard@151: class XSDClassFactory(ClassFactory): lbessard@151: lbessard@151: def __init__(self, document, debug = False): lbessard@151: ClassFactory.__init__(self, document, debug) lbessard@151: self.Namespaces["xml"] = { lbessard@151: "lang" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateEnumeratedExtraction("lang", LANGUAGES) lbessard@151: } lbessard@151: } lbessard@151: } lbessard@151: self.Namespaces["xsi"] = { lbessard@151: "noNamespaceSchemaLocation" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : NotSupportedYet("noNamespaceSchemaLocation") lbessard@151: } lbessard@151: }, lbessard@151: "nil" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : NotSupportedYet("nil") lbessard@151: } lbessard@151: }, lbessard@151: "schemaLocation" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : NotSupportedYet("schemaLocation") lbessard@151: } lbessard@151: }, lbessard@151: "type" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : NotSupportedYet("type") lbessard@151: } lbessard@151: } lbessard@151: } lbessard@151: lbessard@151: def ParseSchema(self): lbessard@151: schema = self.Document.childNodes[0] lbessard@151: for qualified_name, attr in schema._attrs.items(): lbessard@151: value = GetAttributeValue(attr) lbessard@151: if value == "http://www.w3.org/2001/XMLSchema": lbessard@151: namespace, name = DecomposeQualifiedName(qualified_name) lbessard@151: if namespace == "xmlns": lbessard@151: self.DefinedNamespaces["http://www.w3.org/2001/XMLSchema"] = name lbessard@151: self.SchemaNamespace = name lbessard@151: else: lbessard@151: self.DefinedNamespaces["http://www.w3.org/2001/XMLSchema"] = self.SchemaNamespace lbessard@151: self.Namespaces[self.SchemaNamespace] = XSD_NAMESPACE lbessard@151: self.Schema = XSD_NAMESPACE["schema"]["extract"]["default"](self, schema) lbessard@151: ReduceSchema(self, self.Schema[1], self.Schema[2]) lbessard@151: lbessard@151: def FindSchemaElement(self, element_name, element_type): lbessard@151: namespace, name = DecomposeQualifiedName(element_name) lbessard@151: element = self.GetQualifiedNameInfos(name, namespace, True) lbessard@151: if element is None and namespace == self.TargetNamespace and name not in self.CurrentCompilations: lbessard@151: self.CurrentCompilations.append(name) lbessard@151: element = self.CreateSchemaElement(name, element_type) lbessard@151: self.CurrentCompilations.pop(-1) lbessard@151: if element is not None: lbessard@151: self.Namespaces[self.TargetNamespace][name] = element lbessard@151: if element is None: lbessard@151: if name in self.CurrentCompilations: lbessard@151: if self.Debug: lbessard@151: print "Warning : \"%s\" is circular referenced!"%element_name lbessard@151: return element_name lbessard@151: else: lbessard@151: raise ValueError, "\"%s\" isn't defined!"%element_name lbessard@151: if element["type"] != element_type: lbessard@151: raise ValueError, "\"%s\" isn't a group!"%element_name lbessard@151: return element lbessard@151: lbessard@151: def CreateSchemaElement(self, element_name, element_type): lbessard@151: for type, attributes, elements in self.Schema[2]: lbessard@151: namespace, name = DecomposeQualifiedName(type) lbessard@151: if "name" in attributes and attributes["name"] == element_name: lbessard@151: element_infos = None lbessard@151: if element_type == ATTRIBUTE and name == "attribute": lbessard@151: element_infos = ReduceAttribute(self, attributes, elements) lbessard@151: elif element_type == ELEMENT and name == "element": lbessard@151: element_infos = ReduceElement(self, attributes, elements) lbessard@151: elif element_type == ATTRIBUTESGROUP and name == "attributeGroup": lbessard@151: element_infos = ReduceAttributeGroup(self, attributes, elements) lbessard@151: elif element_type == ELEMENTSGROUP and name == "group": lbessard@151: element_infos = ReduceGroup(self, attributes, elements) lbessard@151: elif element_type == SIMPLETYPE and name == "simpleType": lbessard@151: element_infos = ReduceSimpleType(self, attributes, elements) lbessard@151: elif element_type == COMPLEXTYPE and name == "complexType": lbessard@151: element_infos = ReduceComplexType(self, attributes, elements) lbessard@151: if element_infos is not None: lbessard@151: self.Namespaces[self.TargetNamespace][element_name] = element_infos lbessard@151: return element_infos lbessard@151: return None lbessard@151: lbessard@151: """ lbessard@151: This function opens the xsd file and generate the classes from the xml tree lbessard@151: """ lbessard@151: def GenerateClassesFromXSD(filename, declare = False): lbessard@151: xsdfile = open(filename, 'r') lbessard@151: factory = XSDClassFactory(minidom.parse(xsdfile)) lbessard@151: xsdfile.close() lbessard@151: factory.ParseSchema() lbessard@151: return GenerateClasses(factory, declare) lbessard@151: lbessard@151: """ lbessard@151: This function generate the classes from the xsd given as a string lbessard@151: """ lbessard@151: def GenerateClassesFromXSDstring(xsdstring, declare = False): lbessard@151: factory = XSDClassFactory(minidom.parseString(xsdstring)) lbessard@151: factory.ParseSchema() lbessard@151: return GenerateClasses(factory, declare) lbessard@151: lbessard@151: lbessard@151: #------------------------------------------------------------------------------- lbessard@151: # XSD schema syntax elements lbessard@151: #------------------------------------------------------------------------------- lbessard@151: lbessard@151: XSD_NAMESPACE = { lbessard@151: lbessard@151: #------------------------------------------------------------------------------- lbessard@151: # Syntax elements definition lbessard@151: #------------------------------------------------------------------------------- lbessard@151: lbessard@151: "all" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, element*) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("all", ["id", "maxOccurs", "minOccurs"], lbessard@151: re.compile("((?:annotation )?(?:element )*)")) lbessard@151: }, lbessard@151: "reduce" : ReduceAll lbessard@151: }, lbessard@151: lbessard@151: "annotation" : {"struct" : """ lbessard@151: lbessard@151: Content: (appinfo | documentation)* lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("annotation", ["id"], lbessard@151: re.compile("((?:app_info |documentation )*)")) lbessard@151: }, lbessard@151: "reduce" : ReduceAnnotation lbessard@151: }, lbessard@151: lbessard@151: "any" : {"struct": """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("any", lbessard@151: ["id", "maxOccurs", "minOccurs", "namespace", "processContents"], lbessard@151: re.compile("((?:annotation )?(?:simpleType )*)")) lbessard@151: }, lbessard@151: "reduce" : ReduceAny lbessard@151: }, lbessard@151: lbessard@151: "anyAttribute" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("anyAttribute", lbessard@151: ["id", "namespace", "processContents"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : ReduceAnyAttribute lbessard@151: }, lbessard@151: lbessard@151: "appinfo" : {"struct" : """ lbessard@151: lbessard@151: Content: ({any})* lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("appinfo", ["source"], re.compile("(.*)"), True) lbessard@151: }, lbessard@151: "reduce" : ReduceAppInfo lbessard@151: }, lbessard@151: lbessard@151: "attribute" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, simpleType?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("attribute", lbessard@151: ["default", "fixed", "form", "id", "name", "ref", "type", "use"], lbessard@151: re.compile("((?:annotation )?(?:simpleType )?)")), lbessard@151: "schema" : GenerateElement("attribute", lbessard@151: ["default", "fixed", "form", "id", "name", "type"], lbessard@151: re.compile("((?:annotation )?(?:simpleType )?)")) lbessard@151: }, lbessard@151: "reduce" : ReduceAttribute lbessard@151: }, lbessard@151: lbessard@151: "attributeGroup" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, ((attribute | attributeGroup)*, anyAttribute?)) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("attributeGroup", lbessard@151: ["id", "ref"], ONLY_ANNOTATION), lbessard@151: "schema" : GenerateElement("attributeGroup", lbessard@151: ["id", "name"], lbessard@151: re.compile("((?:annotation )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))")) lbessard@151: }, lbessard@151: "reduce" : ReduceAttributeGroup lbessard@151: }, lbessard@151: lbessard@151: "choice" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (element | group | choice | sequence | any)*) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("choice", ["id", "maxOccurs", "minOccurs"], lbessard@151: re.compile("((?:annotation )?(?:element |group |choice |sequence |any )*)")) lbessard@151: }, lbessard@151: "reduce" : ReduceChoice lbessard@151: }, lbessard@151: lbessard@151: "complexContent" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (restriction | extension)) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("complexContent", ["id", "mixed"], lbessard@151: re.compile("((?:annotation )?(?:restriction |extension ))")) lbessard@151: }, lbessard@151: "reduce" : ReduceComplexContent lbessard@151: }, lbessard@151: lbessard@151: "complexType" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)))) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("complexType", lbessard@151: ["abstract", "block", "final", "id", "mixed", "name"], lbessard@151: re.compile("((?:annotation )?(?:simpleContent |complexContent |(?:(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))))")) lbessard@151: }, lbessard@151: "reduce" : ReduceComplexType lbessard@151: }, lbessard@151: lbessard@151: "documentation" : {"struct" : """ lbessard@151: lbessard@151: Content: ({any})* lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("documentation", lbessard@151: ["source", "lang"], re.compile("(.*)"), True) lbessard@151: }, lbessard@151: "reduce" : ReduceDocumentation lbessard@151: }, lbessard@151: lbessard@151: "element" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*)) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("element", lbessard@151: ["abstract", "block", "default", "final", "fixed", "form", "id", "maxOccurs", "minOccurs", "name", "nillable", "ref", "substitutionGroup", "type"], lbessard@151: re.compile("((?:annotation )?(?:simpleType |complexType )?(?:unique |key |keyref )*)")), lbessard@151: "schema" : GenerateElement("element", lbessard@151: ["abstract", "block", "default", "final", "fixed", "form", "id", "name", "nillable", "substitutionGroup", "type"], lbessard@151: re.compile("((?:annotation )?(?:simpleType |complexType )?(?:unique |key |keyref )*)")) lbessard@151: }, lbessard@151: "reduce" : ReduceElement lbessard@151: }, lbessard@151: lbessard@151: "enumeration" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("enumeration", ["id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("enumeration", False) lbessard@151: }, lbessard@151: lbessard@151: "extension" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("extension", ["base", "id"], lbessard@151: re.compile("((?:annotation )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))")), lbessard@151: "complexContent" : GenerateElement("extension", ["base", "id"], lbessard@151: re.compile("((?:annotation )?(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))")) lbessard@151: }, lbessard@151: "reduce" : ReduceExtension lbessard@151: }, lbessard@151: lbessard@151: "field" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("field", ["id", "xpath"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : ReduceField lbessard@151: }, lbessard@151: lbessard@151: "fractionDigits" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("fractionDigits", lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("fractionDigits", True) lbessard@151: }, lbessard@151: lbessard@151: "group" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (all | choice | sequence)?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("group", lbessard@151: ["id", "maxOccurs", "minOccurs", "ref"], lbessard@151: re.compile("((?:annotation )?(?:all |choice |sequence )?)")), lbessard@151: "schema" : GenerateElement("group", lbessard@151: ["id", "name"], lbessard@151: re.compile("((?:annotation )?(?:all |choice |sequence )?)")) lbessard@151: }, lbessard@151: "reduce" : ReduceGroup lbessard@151: }, lbessard@151: lbessard@151: "import" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("import", lbessard@151: ["id", "namespace", "schemaLocation"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : ReduceImport lbessard@151: }, lbessard@151: lbessard@151: "include" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("include", lbessard@151: ["id", "schemaLocation"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : ReduceInclude lbessard@151: }, lbessard@151: lbessard@151: "key" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (selector, field+)) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("key", ["id", "name"], lbessard@151: re.compile("((?:annotation )?(?:selector |(?:field )+))")) lbessard@151: }, lbessard@151: "reduce" : ReduceKey lbessard@151: }, lbessard@151: lbessard@151: "keyref" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (selector, field+)) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("keyref", ["id", "name", "refer"], lbessard@151: re.compile("((?:annotation )?(?:selector |(?:field )+))")) lbessard@151: }, lbessard@151: "reduce" : ReduceKeyRef lbessard@151: }, lbessard@151: lbessard@151: "length" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("length", lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("length", True) lbessard@151: }, lbessard@151: lbessard@151: "list" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, simpleType?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("list", ["id", "itemType"], lbessard@151: re.compile("((?:annotation )?(?:simpleType )?)$")) lbessard@151: }, lbessard@151: "reduce" : ReduceList lbessard@151: }, lbessard@151: lbessard@151: "maxExclusive" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("maxExclusive", lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("maxExclusive", True) lbessard@151: }, lbessard@151: lbessard@151: "maxInclusive" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("maxInclusive", lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("maxInclusive", True) lbessard@151: }, lbessard@151: lbessard@151: "maxLength" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("maxLength", lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("maxLength", True) lbessard@151: }, lbessard@151: lbessard@151: "minExclusive" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("minExclusive", lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("minExclusive", True) lbessard@151: }, lbessard@151: lbessard@151: "minInclusive" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("minInclusive", lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("minInclusive", True) lbessard@151: }, lbessard@151: lbessard@151: "minLength" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("minLength", lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("minLength", True) lbessard@151: }, lbessard@151: lbessard@151: "pattern" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("pattern", ["id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("pattern", False) lbessard@151: }, lbessard@151: lbessard@151: "redefine" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation | (simpleType | complexType | group | attributeGroup))* lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("refine", ["id", "schemaLocation"], lbessard@151: re.compile("((?:annotation |(?:simpleType |complexType |group |attributeGroup ))*)")) lbessard@151: }, lbessard@151: "reduce" : ReduceRedefine lbessard@151: }, lbessard@151: lbessard@151: "restriction" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("restriction", ["base", "id"], lbessard@151: re.compile("((?:annotation )?(?:(?:simpleType )?(?:(?:minExclusive |minInclusive |maxExclusive |maxInclusive |totalDigits |fractionDigits |length |minLength |maxLength |enumeration |whiteSpace |pattern )*)))")), lbessard@151: "simpleContent" : GenerateElement("restriction", ["base", "id"], lbessard@151: re.compile("((?:annotation )?(?:(?:simpleType )?(?:(?:minExclusive |minInclusive |maxExclusive |maxInclusive |totalDigits |fractionDigits |length |minLength |maxLength |enumeration |whiteSpace |pattern )*)?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?)))")), lbessard@151: "complexContent" : GenerateElement("restriction", ["base", "id"], lbessard@151: re.compile("((?:annotation )?(?:(?:simpleType )?(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?)))")), lbessard@151: }, lbessard@151: "reduce" : ReduceRestriction lbessard@151: }, lbessard@151: lbessard@151: "schema" : {"struct" : """ lbessard@151: lbessard@151: Content: ((include | import | redefine | annotation)*, (((simpleType | complexType | group | attributeGroup) | element | attribute | notation), annotation*)*) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("schema", lbessard@151: ["attributeFormDefault", "blockDefault", "elementFormDefault", "finalDefault", "id", "targetNamespace", "version", "lang"], lbessard@151: re.compile("((?:include |import |redefine |annotation )*(?:(?:(?:simpleType |complexType |group |attributeGroup )|element |attribute |annotation )(?:annotation )*)*)")) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "selector" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("selector", ["id", "xpath"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : ReduceSelector lbessard@151: }, lbessard@151: lbessard@151: "sequence" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (element | group | choice | sequence | any)*) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("sequence", ["id", "maxOccurs", "minOccurs"], lbessard@151: re.compile("((?:annotation )?(?:element |group |choice |sequence |any )*)")) lbessard@151: }, lbessard@151: "reduce" : ReduceSequence lbessard@151: }, lbessard@151: lbessard@151: "simpleContent" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (restriction | extension)) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("simpleContent", ["id"], lbessard@151: re.compile("((?:annotation )?(?:restriction |extension ))")) lbessard@151: }, lbessard@151: "reduce" : ReduceSimpleContent lbessard@151: }, lbessard@151: lbessard@151: "simpleType" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (restriction | list | union)) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("simpleType", ["final", "id", "name"], lbessard@151: re.compile("((?:annotation )?(?:restriction |list |union ))")) lbessard@151: }, lbessard@151: "reduce" : ReduceSimpleType lbessard@151: }, lbessard@151: lbessard@151: "totalDigits" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("totalDigits", lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION), lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("totalDigits", True) lbessard@151: }, lbessard@151: lbessard@151: "union" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, simpleType*) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("union", ["id", "memberTypes"], lbessard@151: re.compile("((?:annotation )?(?:simpleType )*)")) lbessard@151: }, lbessard@151: "reduce" : ReduceUnion lbessard@151: }, lbessard@151: lbessard@151: "unique" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?, (selector, field+)) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("unique", ["id", "name"], lbessard@151: re.compile("((?:annotation )?(?:selector |(?:field )+))")) lbessard@151: }, lbessard@151: "reduce" : ReduceUnique lbessard@151: }, lbessard@151: lbessard@151: "whiteSpace" : {"struct" : """ lbessard@151: lbessard@151: Content: (annotation?) lbessard@151: """, lbessard@151: "type" : SYNTAXELEMENT, lbessard@151: "extract" : { lbessard@151: "default" : GenerateElement("whiteSpace", lbessard@151: ["fixed", "id", "value"], ONLY_ANNOTATION) lbessard@151: }, lbessard@151: "reduce" : GenerateFacetReducing("whiteSpace", True) lbessard@151: }, lbessard@151: lbessard@151: #------------------------------------------------------------------------------- lbessard@151: # Syntax attributes definition lbessard@151: #------------------------------------------------------------------------------- lbessard@151: lbessard@151: "abstract" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GetBoolean lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : False lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "attributeFormDefault" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateEnumeratedExtraction("member attributeFormDefault", ["qualified", "unqualified"]) lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : "unqualified" lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "base" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member base", QName_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "block" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateGetList("block", ["restriction", "extension", "substitution"]) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "blockDefault" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateGetList("block", ["restriction", "extension", "substitution"]) lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : "" lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "default" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GetAttributeValue lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "elementFormDefault" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateEnumeratedExtraction("member elementFormDefault", ["qualified", "unqualified"]) lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : "unqualified" lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "final" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateGetList("final", ["restriction", "extension", "substitution"]), lbessard@151: "simpleType" : GenerateGetList("final", ["list", "union", "restriction"]) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "finalDefault" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateGetList("finalDefault", ["restriction", "extension", "list", "union"]) lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : "" lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "fixed" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GetBoolean, lbessard@151: "attribute" : GetAttributeValue, lbessard@151: "element" : GetAttributeValue lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : False, lbessard@151: "attribute" : None, lbessard@151: "element" : None lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "form" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateEnumeratedExtraction("member form", ["qualified", "unqualified"]) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "id" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member id", NCName_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "itemType" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member itemType", QName_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "memberTypes" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameListExtraction("member memberTypes", QNames_model) lbessard@151: }, lbessard@151: }, lbessard@151: lbessard@151: "maxOccurs" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateLimitExtraction(), lbessard@151: "all" : GenerateLimitExtraction(1, 1, False) lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : 1 lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "minOccurs" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateLimitExtraction(unbounded = False), lbessard@151: "all" : GenerateLimitExtraction(0, 1, False) lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : 1 lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "mixed" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GetBoolean lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : None, lbessard@151: "complexType" : False lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "name" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member name", NCName_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "namespace" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member namespace", URI_model), lbessard@151: "any" : GetNamespaces lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : None, lbessard@151: "any" : "##any" lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "nillable" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GetBoolean lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : False lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "processContents" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateEnumeratedExtraction("member processContents", ["lax", "skip", "strict"]) lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : "strict" lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "ref" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member ref", QName_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "refer" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member refer", QName_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "schemaLocation" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member schemaLocation", URI_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "source" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member source", URI_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "substitutionGroup" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member substitutionGroup", QName_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "targetNamespace" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member targetNamespace", URI_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "type" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateModelNameExtraction("member type", QName_model) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "use" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GenerateEnumeratedExtraction("member usage", ["required", "optional", "prohibited"]) lbessard@151: }, lbessard@151: "default" : { lbessard@151: "default" : "optional" lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "value" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GetAttributeValue, lbessard@151: "fractionDigits" : GenerateIntegerExtraction(minInclusive=0), lbessard@151: "length" : GenerateIntegerExtraction(minInclusive=0), lbessard@151: "maxLength" : GenerateIntegerExtraction(minInclusive=0), lbessard@151: "minLength" : GenerateIntegerExtraction(minInclusive=0), lbessard@151: "totalDigits" : GenerateIntegerExtraction(minExclusive=0), lbessard@151: "whiteSpace" : GenerateEnumeratedExtraction("value", ["collapse", "preserve", "replace"]) lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "version" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : GetToken lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: "xpath" : { lbessard@151: "type" : SYNTAXATTRIBUTE, lbessard@151: "extract" : { lbessard@151: "default" : NotSupportedYet("xpath") lbessard@151: } lbessard@151: }, lbessard@151: lbessard@151: #------------------------------------------------------------------------------- lbessard@151: # Simple types definition lbessard@151: #------------------------------------------------------------------------------- lbessard@151: lbessard@151: "string" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "string", lbessard@151: "extract" : GetAttributeValue, lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x : x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "normalizedString" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "normalizedString", lbessard@151: "extract" : GetNormalizedString, lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x : x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "token" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "token", lbessard@151: "extract" : GetToken, lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x : x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "base64Binary" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "base64Binary", lbessard@151: "extract" : NotSupportedYet("base64Binary"), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "hexBinary" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "hexBinary", lbessard@151: "extract" : GetHexInteger, lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x : "%X"%x), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "integer" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "integer", lbessard@151: "extract" : GenerateIntegerExtraction(), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "positiveInteger" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "positiveInteger", lbessard@151: "extract" : GenerateIntegerExtraction(minExclusive=0), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "negativeInteger" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "negativeInteger", lbessard@151: "extract" : GenerateIntegerExtraction(maxExclusive=0), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "nonNegativeInteger" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "nonNegativeInteger", lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=0), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "nonPositiveInteger" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "nonPositiveInteger", lbessard@151: "extract" : GenerateIntegerExtraction(maxInclusive=0), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "long" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "long", lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=-2**63,maxExclusive=2**63), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "unsignedLong" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "unsignedLong", lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**64), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "int" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "int", lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=-2**31,maxExclusive=2**31), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "unsignedInt" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "unsignedInt", lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**32), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "short" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "short", lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=-2**15,maxExclusive=2**15), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "unsignedShort" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "unsignedShort", lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**16), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "byte" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "byte", lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=-2**7,maxExclusive=2**7), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "unsignedByte" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "unsignedByte", lbessard@151: "extract" : GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**8), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: 0, lbessard@151: "check" : lambda x: isinstance(x, IntType) lbessard@151: }, lbessard@151: lbessard@151: "decimal" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "decimal", lbessard@151: "extract" : GenerateFloatExtraction("decimal"), lbessard@151: "facets" : DECIMAL_FACETS, lbessard@151: "generate" : GenerateFloatXMLText(), lbessard@151: "initial" : lambda: 0., lbessard@151: "check" : lambda x: isinstance(x, (IntType, FloatType)) lbessard@151: }, lbessard@151: lbessard@151: "float" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "float", lbessard@151: "extract" : GenerateFloatExtraction("float", ["INF", "-INF", "NaN"]), lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateFloatXMLText(["INF", "-INF", "NaN"]), lbessard@151: "initial" : lambda: 0., lbessard@151: "check" : lambda x: {"INF" : True, "-INF" : True, "NaN" : True}.get(x, isinstance(x, (IntType, FloatType))) lbessard@151: }, lbessard@151: lbessard@151: "double" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "double", lbessard@151: "extract" : GenerateFloatExtraction("double", ["INF", "-INF", "NaN"]), lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateFloatXMLText(["INF", "-INF", "NaN"]), lbessard@151: "initial" : lambda: 0., lbessard@151: "check" : lambda x: {"INF" : True, "-INF" : True, "NaN" : True}.get(x, isinstance(x, (IntType, FloatType))) lbessard@151: }, lbessard@151: lbessard@151: "boolean" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "boolean", lbessard@151: "extract" : GetBoolean, lbessard@151: "facets" : ["pattern", "whiteSpace"], lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x:{True : "true", False : "false"}[x]), lbessard@151: "initial" : lambda: False, lbessard@151: "check" : lambda x: isinstance(x, BooleanType) lbessard@151: }, lbessard@151: lbessard@151: "duration" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "duration", lbessard@151: "extract" : NotSupportedYet("duration"), lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "dateTime" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "dateTime", lbessard@151: "extract" : GetDateTime, lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: datetime.datetime(1,1,1,0,0,0,0), lbessard@151: "check" : lambda x: isinstance(x, datetime.datetime) lbessard@151: }, lbessard@151: lbessard@151: "date" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "date", lbessard@151: "extract" : GetDate, lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: datetime.date(1,1,1), lbessard@151: "check" : lambda x: isinstance(x, datetime.date) lbessard@151: }, lbessard@151: lbessard@151: "time" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "time", lbessard@151: "extract" : GetTime, lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: datetime.time(0,0,0,0), lbessard@151: "check" : lambda x: isinstance(x, datetime.time) lbessard@151: }, lbessard@151: lbessard@151: "gYear" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "gYear", lbessard@151: "extract" : NotSupportedYet("gYear"), lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "gYearMonth" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "gYearMonth", lbessard@151: "extract" : NotSupportedYet("gYearMonth"), lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "gMonth" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "gMonth", lbessard@151: "extract" : NotSupportedYet("gMonth"), lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "gMonthDay" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "gMonthDay", lbessard@151: "extract" : NotSupportedYet("gMonthDay"), lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "gDay" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "gDay", lbessard@151: "extract" : NotSupportedYet("gDay"), lbessard@151: "facets" : NUMBER_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(str), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "Name" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "Name", lbessard@151: "extract" : GenerateModelNameExtraction("Name", Name_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "QName" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "QName", lbessard@151: "extract" : GenerateModelNameExtraction("QName", QName_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "NCName" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "NCName", lbessard@151: "extract" : GenerateModelNameExtraction("NCName", NCName_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "anyURI" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "anyURI", lbessard@151: "extract" : GenerateModelNameExtraction("anyURI", URI_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "language" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "language", lbessard@151: "extract" : GenerateEnumeratedExtraction("language", LANGUAGES), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "en", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "ID" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "ID", lbessard@151: "extract" : GenerateModelNameExtraction("ID", Name_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "IDREF" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "IDREF", lbessard@151: "extract" : GenerateModelNameExtraction("IDREF", Name_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "IDREFS" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "IDREFS", lbessard@151: "extract" : GenerateModelNameExtraction("IDREFS", Names_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "ENTITY" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "ENTITY", lbessard@151: "extract" : GenerateModelNameExtraction("ENTITY", Name_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "ENTITIES" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "ENTITIES", lbessard@151: "extract" : GenerateModelNameExtraction("ENTITIES", Names_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "NOTATION" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "NOTATION", lbessard@151: "extract" : GenerateModelNameExtraction("NOTATION", Name_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "NMTOKEN" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "NMTOKEN", lbessard@151: "extract" : GenerateModelNameExtraction("NMTOKEN", NMToken_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: "NMTOKENS" : { lbessard@151: "type" : SIMPLETYPE, lbessard@151: "basename" : "NMTOKENS", lbessard@151: "extract" : GenerateModelNameExtraction("NMTOKENS", NMTokens_model), lbessard@151: "facets" : STRING_FACETS, lbessard@151: "generate" : GenerateSimpleTypeXMLText(lambda x: x), lbessard@151: "initial" : lambda: "", lbessard@151: "check" : lambda x: isinstance(x, (StringType, UnicodeType)) lbessard@151: }, lbessard@151: lbessard@151: # Complex Types lbessard@151: "anyType" : {"type" : COMPLEXTYPE, "extract" : lambda x:None}, lbessard@151: } lbessard@151: lbessard@151: if __name__ == '__main__': lbessard@151: classes = GenerateClassesFromXSD("test.xsd") lbessard@151: lbessard@151: # Code for test of test.xsd lbessard@151: xmlfile = open("po.xml", 'r') lbessard@151: tree = minidom.parse(xmlfile) lbessard@151: xmlfile.close() lbessard@151: test = classes["PurchaseOrderType"]() lbessard@151: for child in tree.childNodes: lbessard@151: if child.nodeType == tree.ELEMENT_NODE and child.nodeName == "purchaseOrder": lbessard@151: test.loadXMLTree(child) lbessard@151: test.items.item[0].setquantity(2) lbessard@151: testfile = open("test.xml", 'w') lbessard@151: testfile.write("\n") lbessard@151: testfile.write(test.generateXMLText("purchaseOrder")) lbessard@151: testfile.close()