def startschema(self, targetNamespace):
     self.schema = Schema()
     #self.schema.settargetnamespace(targetNamespace)
     self.schema.targetnamespace = targetNamespace
     self.schema.prefixmappings = self.prefixmappings
     self.prefixmappings = {}
class SchemaContext(object):

    def __init__(self):
        self.schema = None
        self.prefixmappings = {}
        self.elementstack = []
        self.namespaces = {}

    def startschema(self, targetNamespace):
        self.schema = Schema()
        #self.schema.settargetnamespace(targetNamespace)
        self.schema.targetnamespace = targetNamespace
        self.schema.prefixmappings = self.prefixmappings
        self.prefixmappings = {}

    def startprefixmapping(self, prefix, uri):
        self.prefixmappings[prefix] = uri

    def startxmlelement(self, element):
        if len(self.elementstack) > 0:
            parent = self.elementstack[-1]
            parent.add_child(element)
            element.parent = parent
        else:
            self.schema.add_child(element)

        self.elementstack.append(element)

    def endelement(self):
        self.elementstack.pop()

    def handleelement(self, element):
        self.startxmlelement(element)

        # Find parent XML Element
        for tmp_element in reversed(self.elementstack[:-1]):
            if isinstance(tmp_element, Element):
                element.xml_element_parent = tmp_element
                break

        if isinstance(element.parent, Schema):
            # If the parent is the Schema element, than this is a 'top level' element
            self.schema.toplevelelements.append(element)

    def start_fractiondigits(self, value):
        self.startxmlelement(FractionDigits(value))

    def start_mininclusive(self, value):
        self.startxmlelement(MinInclusive(value))

    def start_maxinclusive(self, value):
        self.startxmlelement(MaxInclusive(value))

    def start_maxlength(self, value):
        self.startxmlelement(MaxLength(value))

    def start_union(self):
        self.startxmlelement(Union())

    def start_sequence(self):
        self.startxmlelement(Sequence())

    def start_all(self):
        self.startxmlelement(All())

    def start_list(self, itemType=None):
        self.startxmlelement(List(itemType))

    def start_complexcontent(self):
        self.startxmlelement(ComplexContent())

    def start_simplecontent(self):
        simplecontent = SimpleContent()

        parent = self.elementstack[-1]

        if isinstance(parent, ComplexType):
            parent.simplecontent = simplecontent

        self.startxmlelement(simplecontent)

    def start_extension(self, base):
        extension = Extension()
        basetyperef = QName(*QName.split(base))

        if basetyperef.namespacename in self.schema.prefixmappings:
            basetyperef = QName(self.schema.prefixmappings[basetyperef.namespacename], basetyperef.localname)

        extension.basetypereference = basetyperef

        parent = self.elementstack[-1]

        if isinstance(parent, (SimpleContent, ComplexContent)):
            parent.extension = extension

        self.startxmlelement(extension)

    def start_choice(self):
        self.startxmlelement(Choice())

    def start_attribute(self, name, type=None, use=None):
        attribute = Attribute()
        attribute.name = name
        attribute.type = type
        attribute.use = use

        self.startxmlelement(attribute)

    def start_restriction(self, base):
        restriction = Restriction()
        restriction.base = base

        self.startxmlelement(restriction)

    def start_enumeration(self, value):
        self.startxmlelement(Enumeration(value))

    def start_simpletype(self, name=None):
        self.startxmlelement(SimpleType(name))

    def start_complextype(self, name=None, abstract=False):
        complexType = ComplexType()
        complexType.name = name
        complexType.abstract = abstract

        self.startxmlelement(complexType)

    def start_element(self, name=None, type=None, ref=None, substitutionGroup=None, minOccurs=None, maxOccurs=None):
        element = Element()
        element.name = name

        if ref:
            (namespacename, localname) = QName.split(ref)

            if namespacename in self.schema.prefixmappings:
                elementref = QName(self.schema.prefixmappings[namespacename], localname)
            else:
                elementref = QName(namespacename, localname)

            element.ref = elementref

        if type:
            (namespacename, localname) = QName.split(type)

            if namespacename in self.schema.prefixmappings:
                typename = QName(self.schema.prefixmappings[namespacename], localname)
            else:
                typename = QName(namespacename, localname)

            element.typename = typename

        if substitutionGroup:
            (namespacename, localname) = QName.split(substitutionGroup)

            if namespacename in self.schema.prefixmappings:
                elementref = QName(self.schema.prefixmappings[namespacename], localname)
            else:
                elementref = QName(namespacename, localname)

            element.substitutiongroup = elementref

        if minOccurs:
            try:
                element.minoccurs = int(minOccurs)
            except ValueError:
                element.minoccurs = minOccurs

        if maxOccurs:
            try:
                element.maxoccurs = int(maxOccurs)
            except ValueError:
                element.maxoccurs = maxOccurs

        self.handleelement(element)

    def start_import(self, namespace=None, schemaLocation=None):
        importElement = Import()
        importElement.namespacename = namespace
        importElement.schemaLocation = schemaLocation

        self.startxmlelement(importElement)

    def start_include(self, targetNamespace=None, schemaLocation=None):
        include = Include()
        include.schemaLocation = schemaLocation
        include.targetnamespace = targetNamespace

        self.startxmlelement(include)